【发布时间】:2014-06-01 17:32:54
【问题描述】:
如何检查类的字节码(使用 ASM 之类的东西)以了解将哪些初始值传递给方法?
例如:给定一些相互传递值的方法:
void m1(Object o) {
Object v = o;
m2(v);
m2("box");
}
void m2(Object o) {
Object v = o;
m3(x);
}
void m3(Object o) {
}
还有一些方法调用,都定义在同一个类中:
{
Object foo = "foo";
m1(foo);
m2("bar");
m3("baz");
}
如何检查类的字节码以了解 m3 将被调用 4 次,其值为 "foo"、"box"、"bar" 和 "baz"?
【问题讨论】:
-
通常你不能在不运行程序(或模拟它)的情况下做到这一点。这可以归结为停机问题。
-
@immibis - 我不太确定 - 输入清楚地编码在字节码中。它们可以跟随到最后的
m3调用。就像你可以通过查看上面的帖子来做到这一点一样,你可以通过检查字节码来做到这一点。我只是不清楚以编程方式解决此问题的最佳方法。 -
“一般”意味着对于声称这样做的任何程序,有一些输入程序要么使其产生不正确的输出,要么使其永远循环。仍然有一些算法适用于所有可能程序的某些子集。
标签: java java-bytecode-asm bytecode-manipulation