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 使用它来围绕原始代码包装逻辑无需更换。
我在 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 使用它来围绕原始代码包装逻辑无需更换。