【问题标题】:Override a class method from a string with byte-buddy?用字节伙伴覆盖字符串中的类方法?
【发布时间】:2018-01-26 15:39:44
【问题描述】:

假设我有以下类(或者也可以使用接口来完成?):

class MyCustomClass {
    boolean myCustomMethod(int a, int b){}
}

还有以下字符串:

Math.abs(a - b) >= 10;

有没有办法通过 Byte Buddy 将字符串中的代码注入 MyCustomClass 的新子类,在方法 myCustomMethod 中?即使String之前用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
    }
}

【问题讨论】:

  • 这是怎么回事:Math.abs(a - b) >= 10;一个字符串?
  • 不,诠释。我的问题确实需要澄清。
  • 我很欣赏超级快速的回归 ;-)
  • 好的,再次感谢。现在,如果 Dalvik 可以的话,我必须在 Android 中找到一种方法。

标签: java android antlr4 byte-buddy


【解决方案1】:

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

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

意思:你在某种程度上把事情复杂化了。你实际上知道你想要最终得到什么 - 所以创建它作为 java 源代码,并以编程方式转到 javac 以将其转换为字节码。

对于 Android,JavaSourceToDex 类可能是要使用的东西。

【讨论】:

  • 谢谢,我想我明白你的意思了。我的目标只是从文件中读取代码,并将其注入子类匿名实例(或命名子类的实例)中:整体注入到一个 android 项目中。所以也许 ByteBuddy 库不适合那个。查看 JavaCompiler 示例。 (编辑:似乎 JavaCompiler 是要走的路:非常感谢)。
  • 但是这个方法不能用于android:没有类javax.tools.JavaCompiler
  • @loloof64 我不是安卓超级大师,但我仍然发现了一些看起来很有希望的东西。请参阅我的更新答案。
  • 谢谢。我正在看。
【解决方案2】:

这不是 Byte Buddy 背后的想法。 Byte Buddy 这样做的方式是实现一个类,该类提供您要调用的方法,然后生成一个代理以从检测类型委托给该方法调用。

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

【讨论】:

  • 感谢您的澄清。同时,从 String 生成代码是我需要的一个重要功能,我将尝试使用 DexMaker,因为 Kotlin 不支持元编程,我需要一种方法让用户从文件中创建自己的函数(或 lambda)。因为我试图达到的目标是不可能的。无论如何,谢谢你指出我这个限制:)
  • 最后,我会听从您的建议,不要在运行时使用字节码操纵器编译字符串,因为我找到了一种更好的方法来满足我的需求:感谢 ANTLR4 和自定义类层次结构和评估器函数。再次感谢您指出我的想法对于 Android 系统来说太糟糕了,让我重新考虑我的策略。
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多