【发布时间】:2012-12-25 18:31:54
【问题描述】:
我需要对其他开发人员编写的 Java-EE Struts2 Web 应用程序进行一些更改。
由于我不确切知道它是如何工作的,我想映射在每个请求上调用的所有操作和方法,以便在更改之前更好地了解 Web 应用程序工作流程。
有没有办法实现这个目标?
【问题讨论】:
标签: java eclipse debugging struts2 struts
我需要对其他开发人员编写的 Java-EE Struts2 Web 应用程序进行一些更改。
由于我不确切知道它是如何工作的,我想映射在每个请求上调用的所有操作和方法,以便在更改之前更好地了解 Web 应用程序工作流程。
有没有办法实现这个目标?
【问题讨论】:
标签: java eclipse debugging struts2 struts
正如我从你的问题中得到的,你可以尝试这样使用。
如果您找到了动作类和execute(),那么这对您来说可能很容易,在调试模式下运行应用程序并从execute() 函数的开头开始调试。按F6 逐行调试它,如果您看到任何新函数然后进入函数内部按F5 或手动转到函数在那里放置新断点然后按F6 转到该函数。
希望对你有帮助
【讨论】:
采用以下一种(或多种)方法:
查看您的struts.xml,了解Configuration Elements(尤其是Actions 和methods)是如何映射的,以及如何在编译时重现应用程序的行为。
Write an Interceptor记录(或保存在某处)堆栈中传递的所有操作和方法的名称,从请求中读取它们;
实现Preparable Interface 并在prepare() 方法中执行请求日志记录;
通过动态获取类名和方法名
Thread.currentThread().getStackTrace()[level].getMethodName();
根据你应用程序的结构,你可以选择把调用放在“某处”这一行,以记录所有调用的类名和方法。
我建议你this implementation,为你解决深度级别问题:
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 这将超出您的实际需求,尽管这是您所要求的。一旦你有了这个输出,你就可以开始把它缩小到更现实的东西。
(您实际上可以用它玩一些有趣的游戏,包括创建序列图。)
【讨论】: