Java 如何使用ByteBuddy';s@Advice.AllArguments?

Java 如何使用ByteBuddy';s@Advice.AllArguments?,java,byte-buddy,Java,Byte Buddy,我正在使用ByteBuddy的@Advice转换我的类,在我尝试替换输入参数之前,它工作得很好 我有一个FooService和一个join方法,该方法只使用空格连接两个字符串 公共类服务{ 公共字符串联接(字符串消息,字符串消息1){ 返回消息+“”+message1; } } 我还有另一个方法,它接受对象[]args数组输入并更改数组中的元素 公共静态ArgsProcessor ArgsProcessor=args->{ args[0]=args[0]+“-后缀”; args[1]=“已替换

我正在使用ByteBuddy的
@Advice
转换我的类,在我尝试替换输入参数之前,它工作得很好

我有一个
FooService
和一个
join
方法,该方法只使用空格连接两个字符串

公共类服务{
公共字符串联接(字符串消息,字符串消息1){
返回消息+“”+message1;
}
}
我还有另一个方法,它接受
对象[]args
数组输入并更改数组中的元素

公共静态ArgsProcessor ArgsProcessor=args->{
args[0]=args[0]+“-后缀”;
args[1]=“已替换”;
};
我尝试了不同的方法来使用
argsProcessor
操作
@Advice.OnMethodEnter
方法中的输入参数。对我来说,以下建议实现几乎是等效的,应该都能工作,但不知何故,只有
Advice1
能工作

公共静态类公告1{
@忠告,忠告
公共静态void-oneter(@Advice.AllArguments(readOnly=false,typing=Assigner.typing.DYNAMIC)对象[]args){
Object[]newArgs=Arrays.copyOf(args,args.length);
ArgsProcessor ArgsProcessor=Demo.ArgsProcessor;
argsProcessor.process(新args);
args=新args;
}
}
公共静态类公告2{
@忠告,忠告
公共静态void-oneter(@Advice.AllArguments(readOnly=false,typing=Assigner.typing.DYNAMIC)对象[]args){
Object[]newArgs=新对象[args.length];
ArgsProcessor ArgsProcessor=Demo.ArgsProcessor;
args进程进程(args);
数组复制(args,0,newArgs,0,args.length);
args=新args;
}
}
公共静态类公告3{
@忠告,忠告
公共静态void-oneter(@Advice.AllArguments(readOnly=false,typing=Assigner.typing.DYNAMIC)对象[]args){
Object[]newArgs=Arrays.copyOf(args,args.length);
试一试{
ArgsProcessor ArgsProcessor=Demo.ArgsProcessor;
argsProcessor.process(新args);
args=新args;
}捕获(例外情况除外){
例如printStackTrace();
}
}
}
公共静态类公告4{
@忠告,忠告
公共静态void-oneter(@Advice.AllArguments(readOnly=false,typing=Assigner.typing.DYNAMIC)对象[]args){
ArgsProcessor ArgsProcessor=Demo.ArgsProcessor;
args进程进程(args);
}
}
公共静态类公告5{
@忠告,忠告
公共静态void-oneter(@Advice.AllArguments(readOnly=false,typing=Assigner.typing.DYNAMIC)对象[]args){
ArgsProcessor ArgsProcessor=Demo.ArgsProcessor;
args进程进程(args);
args=Arrays.copyOf(args,args.length);
}
}
输出

Advice1 a-suffix replaced
Advice2 a b
Advice3 a b
Advice4 a b
Advice5 a b

运行代码的代码片段

我明白了

Advice1 a-suffix replaced 
Advice2 a b 
Advice3 a-suffix replaced 
Advice4 a b 
Advice5 a b
我的期望是什么。Byte Buddy使用通知方法作为模板。这段代码没有真正执行。在方法中读取
args
时,Byte Buddy每次都会创建一个新数组

因此,计算
args==args
将返回
false
,因为Byte Buddy每次都会创建一个包含所有参数的新数组!如果更改args数组,则必须将其写回Byte Buddy以发现相应的字节码并将其映射回分配