是否可以在 ByteBuddy 中使用 @Advice.AllArguments 拦截没有参数的方法?
Is it possible to intercept a method that has no arguments with using @Advice.AllArguments in ByteBuddy?
我正在尝试创建一个将采用一系列方法的日志记录系统。我拦截的一些方法有 0 个参数,其他方法有很多。我的问题是:我可以创建一个通用的 @Advice.OnMethodEnter
来捕获使用 @Advice.AllArguments
和 ByteBuddy 的参数吗?
方法看起来像这样:
@Advice.OnMethodEnter
public static void intercept(@Port int port,
@Host String host,
@Advice.Origin("#t:#m") String signature,
@Advice.AllArguments Object[] arguments)
{
AgentHelper.log(host, port, signature, Arrays.toString(arguments));
}
当注释 @Advice.AllArguments
丢失时,一切正常,但我一放,所有没有参数的方法都被忽略。
我还尝试查看是否存在使用以下方法引发的显式错误:
new AgentBuilder.Default()
...
.with(AgentBuilder.Listener.StreamWriting.toSystemOut().withErrorsOnly())
.with(AgentBuilder.InstallationListener.StreamWriting.toSystemOut())
...
但这并没有显示任何错误。我是否必须逐个创建拦截器,或者有没有办法以我不理解的方式获得这种行为?
是的,这应该没有问题:
public class Example {
public static void main(String[] args) {
new AgentBuilder.Default()
.disableClassFormatChanges()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(is(Target.class))
.transform((builder, typeDescription, classLoader, module) ->
builder.visit(Advice.to(Example.class).on(isMethod())))
.installOn(ByteBuddyAgent.install());
new Target().method();
}
@Advice.OnMethodEnter
public static void intercept(@Advice.AllArguments Object[] arguments) {
System.out.println("Intercepted: " + Arrays.asList(arguments));
}
public static class Target {
public void method() { }
}
}
这将在调用时打印一个空列表。
我正在尝试创建一个将采用一系列方法的日志记录系统。我拦截的一些方法有 0 个参数,其他方法有很多。我的问题是:我可以创建一个通用的 @Advice.OnMethodEnter
来捕获使用 @Advice.AllArguments
和 ByteBuddy 的参数吗?
方法看起来像这样:
@Advice.OnMethodEnter
public static void intercept(@Port int port,
@Host String host,
@Advice.Origin("#t:#m") String signature,
@Advice.AllArguments Object[] arguments)
{
AgentHelper.log(host, port, signature, Arrays.toString(arguments));
}
当注释 @Advice.AllArguments
丢失时,一切正常,但我一放,所有没有参数的方法都被忽略。
我还尝试查看是否存在使用以下方法引发的显式错误:
new AgentBuilder.Default()
...
.with(AgentBuilder.Listener.StreamWriting.toSystemOut().withErrorsOnly())
.with(AgentBuilder.InstallationListener.StreamWriting.toSystemOut())
...
但这并没有显示任何错误。我是否必须逐个创建拦截器,或者有没有办法以我不理解的方式获得这种行为?
是的,这应该没有问题:
public class Example {
public static void main(String[] args) {
new AgentBuilder.Default()
.disableClassFormatChanges()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(is(Target.class))
.transform((builder, typeDescription, classLoader, module) ->
builder.visit(Advice.to(Example.class).on(isMethod())))
.installOn(ByteBuddyAgent.install());
new Target().method();
}
@Advice.OnMethodEnter
public static void intercept(@Advice.AllArguments Object[] arguments) {
System.out.println("Intercepted: " + Arrays.asList(arguments));
}
public static class Target {
public void method() { }
}
}
这将在调用时打印一个空列表。