ByteBuddy - rebase已经加载了类

时间:2017-12-18 22:57:20

标签: byte-buddy

我在SpringBoot应用程序中使用以下代码,它可以满足我的期望。

TypePool typePool = TypePool.Default.ofClassPath();
ByteBuddyAgent.install();
new ByteBuddy()
        .rebase(typePool.describe("com.foo.Bar").resolve(), ClassFileLocator.ForClassLoader.ofClassPath())
        .implement(typePool.describe("com.foo.SomeInterface").resolve())
        .make()
        .load(ClassLoader.getSystemClassLoader());

它使得com.foo.Bar类实现了com.foo.SomeInterface接口(具有默认实现)

我想。通过将类称为Bar.class而不使用名称的字符串表示形式来使用上面的代码。但如果我这样做,我会得到以下异常。

java.lang.UnsupportedOperationException: class redefinition failed: attempted to change superclass or interfaces

我相信由于它会在重新定义之前导致类被加载。我刚学会使用ByteBuddy。

我希望通过使用ByteBuddy添加接口和实现来避免运行时的某些反射。我还有一些其他代码可以检查这个界面。

1 个答案:

答案 0 :(得分:0)

这是不可能的,不是因为Byte Buddy,而是在常规VM上不允许使用任何工具。 (有所谓的动态代码演化VM)。

如果您想避免此问题,请使用redefine而不是rebase。无论何时使用方法,现在都可以替换原始方法。

如果这是不可接受的,请查看Advice - 类可以使用的.visit类来包装原始代码的逻辑而不替换它。