我希望在解析编译的类文件时,在方法体内调用anther类来替换对给定类的调用…
换句话说,是否有一种方法可以检测方法中给定类的用法,并使用类似javaassist的方法替换方法的那一部分.
例如..如果我有编译版本的
class A { public int m() { int i = 2; B.multiply(i,i); return i; } }
有没有一种方法可以检测B的使用,然后改变要执行的代码
class A { public int m() { int i = 2; C.divide(i,i); return i; } }
我知道另一种方法是编写一个解析器来grep源文件以供使用,但我更喜欢更优雅的解决方案,例如使用反射来生成新的编译类文件.
有什么想法吗 ?
解决方法:
正如@djna所说,可以在加载字节码文件之前对其进行修改,但您可能不希望这样做:
>执行代码修改的代码可能很复杂且难以维护.
>已修改的代码很可能难以调试.首先,源级调试器将显示不再与您实际编辑的代码对应的源代码.
字节码重写在某些情况下很有用.例如,JDO实现使用字节码重写来将对象成员提取替换为对持久性库的调用.但是,如果您可以访问这些文件的源代码,则可以通过预处理(或生成)源代码获得更好(即更易维护)的解决方案.
编辑:AOP或Groovy听起来也像是可行的替代方案,具体取决于您预期的重写程度.
标签:java,methods,reflection,bytecode-manipulation
来源: https://codeday.me/bug/20190527/1160363.html