如何在运行时实现可配置的java代理



在静态java代理中,我们预定义了拦截的类和方法以及相关的通知,代码可能如下所示,这意味着当进入和退出class1.method1()时,MyAdvice中的代码将被执行。

public static void premain(String arguments, Instrumentation instrumentation) {
new AgentBuilder.Default()
.with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
.type("class1")
.transform((builder, typeDescription, classLoader, module) -> builder
.method("method1")
.intercept(Advice.to(MyAdvice.class))
).installOn(instrumentation);
Class MyAdvice{
@Advice.OnMethodEnter
public static void onBeforeExecute(@Advice.AllArguments Object[] params,
@Advice.This Object agr0) {
}
@Advice.OnMethodExit
public static void onAfterExecute() {
}
}
然而,在实际应用程序开始之前,截获的类和方法是预定义和硬编码的。是否有任何方法或框架,预定义一些建议,然后应用程序启动,我们拦截什么可以在运行时通过配置文件动态配置?配置文件可能如下所示:
{
method: "method2",
class: "class2",
advice: "MyAdvice2"
}

这意味着我想拦截class2.method2()和MyAdvice2.class将被使用。

至于Holger的评论,他当然是对的,您需要找到一种方法来发现您的配置已经更改,这与代理无关。当然,你可以从某个线程定期扫描文件,或者注册一个HTTP端点来提交新数据。

对于Byte Buddy,AgentBuilder返回一个ResettableClassFileTransformer,你可以在它的patchOn方法中传递给一个新的AgentBuilder。这将使Byte Buddy计算在更改后需要更新的类的最小子集。它将返回一个新的类文件转换器,允许您稍后使用新的更新重复该过程。

最新更新