【问题标题】:Program flow from main [closed]来自主程序的程序流程[关闭]
【发布时间】: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


【解决方案1】:

如果您想一般地记录任何给定程序的执行流程,您可以使用字节码检测。考虑使用java.lang.instrumentASM 来实现您的目标。看看这个tutorial

无论如何都不容易,但肯定是可行的。

【讨论】:

  • 感谢您提供的链接,我会关注它
猜你喜欢
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多