你想要做什么叫static code analysis - 特别是数据流分析,但有一个转折......你没有表明你在看源代码,但在编译代码......如果你想在运行时做到这一点,在哪里你不得不处理编译的(字节码)代码而不是源代码。因此,您正在寻找一个能够进行字节码数据流分析的库。有很多图书馆可以帮助你(现在你知道要搜索什么,如果你愿意的话,你可以找到替代我的建议)。
好的,没有得到一个例子...我喜欢javassist - 我发现它像一个字节码库一样清晰,可以通过很好的示例和文档在线。 javassit有一些更高层次的bytecode analysis API,所以你可能甚至不必深入挖掘,这取决于你需要做什么。
要为您美孚/酒吧例如打印输出上面,使用下面的代码:
public static void main (String... args) throws Exception {
Analyzer a = new Analyzer();
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("test.Foo");
for (CtMethod cm : cc.getDeclaredMethods()) {
Frame[] frames = a.analyze(cm);
for (Frame f : frames) {
System.out.println(f);
}
}
}
会打印:
locals = [test.Foo, int, test.Bar] stack = []
locals = [test.Foo, int, test.Bar] stack = [int]
locals = [test.Foo, int, test.Bar] stack = [int, int]
null
null
locals = [test.Foo, int, test.Bar] stack = []
locals = [test.Foo, int, test.Bar] stack = [test.Bar]
null
null
locals = [test.Foo, int, test.Bar] stack = []
如果您需要更多的细节,你需要真正阅读字节码,并有JVM specification得心应手:
public static void main (String... args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("test.Foo");
for (CtMethod cm : cc.getDeclaredMethods()) {
MethodInfo mi = cm.getMethodInfo();
CodeAttribute ca = mi.getCodeAttribute();
CodeIterator ci = ca.iterator();
while (ci.hasNext()) {
int index = ci.next();
int op = ci.byteAt(index);
switch (op) {
case Opcode.INVOKEVIRTUAL:
System.out.println("virutal");
//lookup in the JVM spec how to extract the actual method
//call info here
break;
}
}
}
}
我希望这可以帮助你开始=)
http://depfind.sourceforge.net/ – Jayan 2014-10-18 05:26:07
谢谢,如果您提供了如何完成示例的示例,我很乐意接受。 – 2014-10-18 23:19:17
@Jayan,看看这个pastebin。如何将$ 1连接到函数doSomething?在注释部分是打印jdpends出站链接的3个级别的结果http://pastebin.com/b9E4zEdg – 2014-10-19 16:21:02