4

我想知道是否有测试或某种方式知道是否调用函数来分配,我的意思是告诉...

int x = getX();

只是,

getX();

这没有任何实际用途,但我认为知道会很好。

有可能吗?

4

2 回答 2

6

是的,这是可能的,但只能通过分析编译程序的字节码,非常不方便。字节码可以通过获取类字节(通过检测或其他方法)在运行时访问,然后使用第三方库(如ASMBCELJavassist )进行分析。

要搜索分配函数结果的局部变量,您需要查找以下字节码模式:

invokevirtual/static [class:method()signature]
xstore #stack

对于 的确切情况int x = getX();,字节码类似于:

invokevirtual [clazz:getX()I]
istore 1

但当然,clazz是实际所在的类,getX()存储的局部变量 ( ) 的堆栈值xstore可能会有所不同。此外,invokeXXX调用之前会加载方法参数,包括隐式this实例。

总而言之,这是可能的,但并不方便,因为理解字节码不是一日之功。

于 2013-06-01T21:25:18.893 回答
0

这可以通过分析程序的字节码来实现,正如 Vulcan 所说的那样。

顺便想一下,JRE 确实如此。因此,您需要拆分语句

int x = getX();

分成两部分。

JRE 将执行的第一部分是getX并导致类似的结果

int methodResult = getX();

第二部分(这是 JRE 的新声明)类似于

int x = methodResult;

这不是 JRE 的全部内容,但我认为它有助于理解为什么变量int x和方法体之间绝对没有直接联系getX

于 2013-06-01T21:35:40.957 回答