Java 使用byte buddy重新定义类
我想重新定义已经在现有框架中定义的源类。我想用我的增强类自动替换源类的原始实例。我无法访问创建源对象的代码,因此类替换必须在后台自动执行。是否可以使用byte buddy执行此操作Java 使用byte buddy重新定义类,java,instrumentation,byte-buddy,Java,Instrumentation,Byte Buddy,我想重新定义已经在现有框架中定义的源类。我想用我的增强类自动替换源类的原始实例。我无法访问创建源对象的代码,因此类替换必须在后台自动执行。是否可以使用byte buddy执行此操作 ByteBuddyAgent.install(); Source source = new ByteBuddy() .subclass(Source.class) .method(named("hello")).intercept(MethodDeleg
ByteBuddyAgent.install();
Source source = new ByteBuddy()
.subclass(Source.class)
.method(named("hello")).intercept(MethodDelegation.to(Target.class))
.defineMethod("myNewMethod", void.class).intercept(MethodDelegation.to(Target.class))
.make()
.load(Source.class.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent())
.getLoaded()
.newInstance();
可以使用Byte Buddy重新定义类。为此,您将使用
ByteBuddy::redefine
或ByteBuddy::rebase
方法,而不是子类化。使用这些特性的最规范的方法是为您可以使用的AgentBuilder
Ok定义一个Java代理。谢谢尽管只有在子类化的情况下才允许添加新方法,否则我在线程“main”java.lang.UnsupportedOperationException中遇到**异常:类重新定义失败:尝试更改架构(添加/删除字段)**实际上我想做的是:我有一个实现给定接口的对象实例。当前实现创建同一接口的新对象,并将大多数调用委托给原始对象。它还更改了一些方法并添加了一些方法。我想要实现的是使用插装,这样当原始接口更改时,我就不应该每次都向装饰对象添加新方法。我认为最好的方法是使用子类化,并将接口使用方法(isDeclaredBy(Source.class))的所有方法委托给originalYou不能使用Java代理替换类,只能在方法内部添加自定义调度逻辑。我建议您查看建议组件。好的,对不起,我想我根本不需要代理。默认情况下,我将只对实例的所有方法进行子类化并重定向到原始对象。我必须重写或添加的所有方法都将通过defineMethod(新方法)或method(命名为(..))进行处理。intercept.(-)现有方法