从具有byte-buddy的字符串覆盖类方法?

时间:2018-01-25 14:19:04

标签: java android antlr4 byte-buddy

假设我有以下类(或者也可以通过接口完成?):

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
    }
}

2 个答案:

答案 0 :(得分:2)

我认为你走错了路。为什么使用ByteBuddy生成类代码?!

相反:使用JavaCompiler功能简单地构建该类作为Java源代码 - 然后编译它,然后使用“动态”编译类。

含义:你在某种程度上过于复杂。你实际上知道你想要最终得到什么 - 所以创建作为java源,并以编程方式转向javac将其转换为字节码。

对于Android,可能会使用JavaSourceToDex类。

答案 1 :(得分:1)

这不是Byte Buddy背后的想法。 Byte Buddy做这样的事情的方法是实现一个提供你想要调用的方法的类,然后你生成一个代理,从委托类型委托给这个方法调用。

Javassist提供了这样的功能但性能方面,在运行时编译字符串并不好,所以我会不惜一切代价避免这种情况。特别是在Android上,你通常只有有限的资源。阶级生成非常昂贵。