Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用byte buddy重新定义类_Java_Instrumentation_Byte Buddy - Fatal编程技术网

Java 使用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

我想重新定义已经在现有框架中定义的源类。我想用我的增强类自动替换源类的原始实例。我无法访问创建源对象的代码,因此类替换必须在后台自动执行。是否可以使用byte buddy执行此操作

    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.(-)现有方法