测试分配功能

Kac*_*isz 4 java function

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

int x = getX();
Run Code Online (Sandbox Code Playgroud)

只是,

getX();
Run Code Online (Sandbox Code Playgroud)

这没有任何实际用途,但我认为很高兴知道.

有可能吗?

FTh*_*son 6

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

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

invokevirtual/static [class:method()signature]
xstore #stack
Run Code Online (Sandbox Code Playgroud)

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

invokevirtual [clazz:getX()I]
istore 1
Run Code Online (Sandbox Code Playgroud)

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

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