我想知道是否有测试或某种方式知道某个函数是否被调用来分配,我的意思是告诉它们之间的区别......
int x = getX();
只是,
getX();
这没有任何实际用途,但我认为最好知道。
可能吗?
答案 0 :(得分:6)
是的,这是可能的,但只能通过分析编译程序的字节码,使其非常不方便。可以通过获取类字节(通过instrumentation或其他方法)在运行时访问字节码,然后使用第三方库(例如ASM,BCEL或Javassist进行分析) 。
要搜索分配了函数结果的局部变量,您需要查找以下字节码模式:
invokevirtual/static [class:method()signature]
xstore #stack
对于int x = getX();
的确切情况,字节码类似于:
invokevirtual [clazz:getX()I]
istore 1
但是当然,clazz
是getX()
所在的实际类,并且存储的局部变量(xstore
)的堆栈值可能会有所不同。此外,invokeXXX
调用之前将加载方法参数,包括隐式this
实例。
总而言之,这是可能的,但不方便,因为理解字节码不是一天的体验。
答案 1 :(得分:0)
这可以通过分析程序的字节码来实现,因为Vulcan只是直截了当。
想一想JRE的做法。因此,您需要拆分语句
int x = getX();
分为两部分。
JRE将执行的第一部分是getX
,结果类似于
int methodResult = getX();
第二部分(这是JRE的新声明)类似于
int x = methodResult;
这不是JRE的全部内容,但我认为有助于理解,为什么变量int x
和方法getX
的主体之间绝对没有直接联系。 / p>