ByteBuddy - 变基已经加载 class

ByteBuddy - rebase already loaded class

我在 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());

它的作用是 class com.foo.Bar 实现了接口 com.foo.SomeInterface(它有一个默认实现)

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

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

我认为是因为它导致 class 在重新定义之前被加载。我刚刚开始学习使用 ByteBuddy。

我想通过使用 ByteBuddy 添加接口和实现来避免在运行时发生一些反射。我有一些其他代码可以检查此接口。

这是不可能的,不是因为 Byte Buddy,而是不允许任何工具在常规 VM 上执行此操作。 (有所谓的动态代码演化 VM 可以做到这一点)。

如果您想避免此问题,请使用 redefine 而不是 rebase。每当您检测一种方法时,您现在都会替换原来的方法。

如果这是不可接受的,请查看 Advice class,您可以通过 .visit-API 使用它来围绕原始代码包装逻辑无需更换。