如何使用 ByteBuddy 创建运行时方法代理

问题描述 投票:0回答:1

我目前正在尝试使用 ByteBuddy 创建一个运行时方法代理,但没有成功。我尝试代理的方法是同一程序的不同插件的一部分(我正在处理的项目也是一个插件,我可以控制加载顺序)并且更改必须影响该类的所有实例.基本上,我使用此代理的目标是在调用超级方法之前执行 If 检查(或不执行取决于检查结果)。

我在这里和 GitHub 上阅读了很多帖子,但还没有找到可行的解决方案。我唯一要做的就是通过像这样重新定义它来完全覆盖超级方法:

ByteBuddyAgent.install();
new ByteBuddy()
  .redefine(Foo.class)
  .method(named("bar").and(takesArguments(String.class, float.class, Integer.class)))
  .intercept(MethodDelegation.to(Interceptor.class))
  .make()
  .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());

public class Interceptor {
   @RuntimeType
   public static void intercept(@AllArguments Object[] allArguments) {
     System.out.println("Intercepted");
   }
}

然而,这不允许我从拦截器内部调用 super 方法,因为当我重新定义它时它会丢失。

java proxy byte-buddy
1个回答
0
投票

如果你重新定义一个类,你会影响所有的实例。对于代理,您通常只想子类化。

如果你想要那样,你需要使用 rebase。通常在使用 Java 代理时。查看可以添加到 JVM 的 AgentBuilder。

© www.soinside.com 2019 - 2024. All rights reserved.