我想知道是否有测试或某种方式知道函数是否被调用来分配,我的意思是告诉它们之间的区别......
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实例.
总而言之,这是可能的,但不方便,因为理解字节码不是一日体验.
| 归档时间: | 
 | 
| 查看次数: | 81 次 | 
| 最近记录: |