【发布时间】:2014-08-24 14:11:07
【问题描述】:
假设
public class A{
public void doSomethingInMethodA(){
int a =0;
System.out.println("value of a :"+a);
}
public static void main(String[] args) {
new A().doSomethingInMethodA();
new B().doSomethingInMethodB();
}
}
class B{
public void doSomethingInMethodB(){
int b =0;
System.out.println("value of b :"+b);
C c = new C();
c.doSomethingInMethodC();
}
}
class C{
public void doSomethingInMethodC(){
int c =0;
System.out.println("value of c :"+c);
}
}
现在我如何以编程方式知道程序的流程。
如果我向某个解析器类提供类 A(带有 main 方法的类)的名称,那么解析器类应该告诉我程序的流程就像
编辑:
A(class with main)
-> doSomethingInMethodA()(Class A)
-> doSomethingInMethodB()(Class B) ->doSomethingInMethodC()(Class C)
program flow ends
where -> means it calls
我想通过反射是不可能的,因为你不能问 java.lang.reflect.Method 你调用了哪些方法?
StackTraceElement 可以吗?我什至听说过 AspectJ 在做这样的事情
那么如何实现呢?
【问题讨论】:
-
您想分析类并检查所有可能的代码路径还是运行程序并逐步查看执行时发生的情况?换句话说,这应该是静态分析还是动态分析?
-
这会比源代码更有帮助吗?至少源代码没有歧义。
-
您想创建描述程序的英文散文吗?为此,您需要构建等效的 Java 编译器,其目标是英语散文而不是字节码。你的结果充其量只是脆弱的。
-
@MarkoTopolnik:好吧,op 可以尝试将其编译成莎士比亚语言,这没什么好说的 ;-) en.wikipedia.org/wiki/Shakespeare_(programming_language)
-
在您看来,“找到程序流程”是什么意思?程序流程的复杂性与源代码的复杂性处于同一数量级,因此要获得除改写源代码之外的任何好处,您需要引入一些有损转换规则,从中提取一个或另一个方面。
标签: java