将Java 代理与Byte Buddy结合使用时,这是完全可能的。例如,您可以修改GpioFactory::getInstance
方法,如下面的 Java 代理所示:
public class MyAgent {
public static void premain(String arg, Instrumentation inst) {
new AgentBuilder.Default()
.type(ElementMatchers.named("com.pi4j.io.gpio.GpioFactory")
.transform((builder, type) -> // Or anonymous class for pre Java 8
builder.method(ElementMatchers.named("getInstance"))
.intercept(MethodDelegation.to(MyFactory.class));
).installOn(inst)
}
}
public class MyFactory {
public static GpioController intercept(@SuperCall Callable<GpioController> s)
throws Exception {
return s.call(); // Wrap controller here.
}
}
使用此代理,从原始方法返回的任何控制器实例getInstance
都将通过该MyFactory::intercept
方法传递。
或者,您可以同样检测 的所有实现GpioController
以直接进行日志记录。这将影响接口的所有实例。
如果您无法在启动时添加 Java 代理,则在 JDK(不是标准 JVM)上,您可以使用ByteBuddyAgent.install()
(来自byte-buddy-agent
依赖项)在运行时手动安装代理。在这种情况下,您需要确保在加载之前安装了代理。您可以在库的文档中GpioFactory
找到更多信息。
最后,请注意 AspectJ 和 Byte Buddy 都使用 Java 代理来实现它们的检测。然而,AspectJ 确实使用自己的语法,其中 Byte Buddy 用 Java 建模其 API,这是主要的核心区别。