我在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添加接口和实现来避免运行时的某些反射。我还有一些其他代码可以检查这个界面。
答案 0 :(得分:0)
这是不可能的,不是因为Byte Buddy,而是在常规VM上不允许使用任何工具。 (有所谓的动态代码演化VM)。
如果您想避免此问题,请使用redefine
而不是rebase
。无论何时使用方法,现在都可以替换原始方法。
如果这是不可接受的,请查看Advice
- 类可以使用的.visit
类来包装原始代码的逻辑而不替换它。