假设我有以下类(或者也可以通过接口完成?):
class MyCustomClass {
boolean myCustomMethod(int a, int b){}
}
以下字符串:
Math.abs(a - b) >= 10;
有没有办法,Byte Buddy,在myCustomMethod方法中将字符串中的代码注入到MyCustomClass的新子类中?即使在之前使用ANTLR处理字符串?
所以我得到
class MyCustomClass_SubClassInstance extends MyCustomClass {
// I know that with ByteBuddy, all this "ceremonial" code is not needed.
boolean myCustomMethod(int a, int b){
Math.abs(a - b) >= 10; // Injected code from the string
}
}
答案 0 :(得分:2)
我认为你走错了路。为什么使用ByteBuddy生成类代码?!
相反:使用JavaCompiler功能简单地构建该类作为Java源代码 - 然后编译它,然后使用“动态”编译类。
含义:你在某种程度上过于复杂。你实际上知道你想要最终得到什么 - 所以创建作为java源,并以编程方式转向javac
将其转换为字节码。
对于Android,可能会使用JavaSourceToDex类。
答案 1 :(得分:1)
这不是Byte Buddy背后的想法。 Byte Buddy做这样的事情的方法是实现一个提供你想要调用的方法的类,然后你生成一个代理,从委托类型委托给这个方法调用。
Javassist提供了这样的功能但性能方面,在运行时编译字符串并不好,所以我会不惜一切代价避免这种情况。特别是在Android上,你通常只有有限的资源。阶级生成非常昂贵。