测试分配功能

时间:2013-06-01 21:10:24

标签: java function

我想知道是否有测试或某种方式知道某个函数是否被调用来分配,我的意思是告诉它们之间的区别......

int x = getX();

只是,

getX();

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

可能吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

invokevirtual [clazz:getX()I]
istore 1

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

总而言之,这是可能的,但不方便,因为理解字节码不是一天的体验。

答案 1 :(得分:0)

这可以通过分析程序的字节码来实现,因为Vulcan只是直截了当。

想一想JRE的做法。因此,您需要拆分语句

int x = getX();

分为两部分。

JRE将执行的第一部分是getX,结果类似于

int methodResult = getX();

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

int x = methodResult;

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