我需要对其他开发人员编写的 Java-EE Struts2 Web 应用程序进行一些更改。
由于我不确切知道它是如何工作的,我想映射每个请求上调用的所有操作和方法,以便在更改之前更好地了解 Web 应用程序工作流程。
有没有办法实现这个目标?
采用以下一种(或多种)方法:
查看您的struts.xml,了解配置元素(尤其是Actions
和methods
)是如何映射的以及如何在编译时重现应用程序的行为。
编写一个拦截器记录(或保存在某处)堆栈中传递的所有操作和方法的名称,从请求中读取它们;
实现Preparable 接口并在方法内执行请求日志记录prepare()
;
通过动态获取类名和方法名
Thread.currentThread().getStackTrace()[level].getMethodName();
根据您的应用程序的结构,您可以选择将调用放在“某处”这一行,以记录所有调用的类名和方法。
我建议你这个实现,它为你解决了深度级别的问题:
public class Utilities {
public static String getCurrentMethod() {
return getCurrentMethodNameFromThread(0);
}
public static String getCallingMethodName() {
return getCurrentMethodNameFromThread(1);
}
private static String getCurrentMethodNameFromThread(int stackLevel) {
/*
* 0 - dumpThreads
* 1 - getStackTrace
* 2 - thisMethod => getCurrentMethodNameFromThread
* 3 - callingMethod => method calling thisMethod
* 4 - method calling callingMethod
*/
StackTraceElement
stackTraceElement =
Thread.currentThread().getStackTrace()[4 + stackLevel];
String className = stackTraceElement.getClassName();
String methodName = stackTraceElement.getMethodName();
return className + "." + methodName;
}
}
所有方法?!还是只是您的应用程序中的那些?
最快、最简单的解决方案(无论如何对我来说)是使用 AOP 来检测您所有应用程序的代码,记录所有条目,并可能退出。IMO 这将超出您的实际需求,尽管这是您所要求的。一旦你有了这个输出,你就可以开始把它缩小到更现实的东西。
(你实际上可以用它玩一些有趣的游戏,包括创建序列图。)
正如我从你的问题中得到的那样,你可以尝试这样使用。
如果您找到了动作类,execute()
那么这对您来说很容易,在调试模式下运行应用程序并从execute()
函数开始开始调试。按F6
逐行调试,如果您看到任何新功能,然后进入该功能按F5
或手动转到该功能,在那里放置新断点,然后按F6
转到该功能。
希望对你有帮助