我需要对其他开发人员编写的Java-EE Struts2 Web应用程序进行一些更改。
因为我不知道它是如何工作的,我想映射每个请求上调用的所有动作和方法,以便在更改它之前更好地理解web应用程序工作流。
有没有办法实现这个目标?
采用以下一种(或多种)方法:
-
看一下struts.xml,看看配置元素(特别是
Actions
和methods
)是如何映射的,以及如何在编译时重现应用程序的行为。 -
写一个拦截器记录(或保存在某处)所有在栈中传递的动作和方法的名称,从请求中读取它们;
-
实现可准备接口并从
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来检测应用程序的所有代码,记录所有条目和可能的退出。在我看来,这比你实际想要的要多,尽管这是你要求的。一旦你有了这样的输出,你就可以开始把它缩小到更现实的东西。
(实际上您可以用它来玩一些有趣的游戏,包括创建序列图。)
正如我从你的问题中得到的,你可以尝试这样使用。
如果您已经找到了操作类和execute()
,那么这对您来说可能很容易,在调试模式下运行应用程序并从execute()
函数的开始开始调试。按F6
逐行调试,如果看到任何新函数,则按F5
或手动转到函数中,然后按F6
转到该函数。
希望对大家有所帮助