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