JoinPoint.getArgs() 是有序的吗?
Is JoinPoint.getArgs() ordered?
说我有这个方法:
public void exampleMethod(String myString, Integer myInteger, Object myObject){}
如果我有一个 @Around
方面,并且我调用 ProceedingJoinPoint.getArgs()
它是否总是 return 一个按签名顺序排序的数组?像这样?
public void aspectMethod(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object[] args = proceedingJoinPoint.getArgs();
args[0]; // String myString?
args[1]; // Integer myInteger?
args[2]; // Object myObject?
}
它看起来确实是确定性的,至少在我 运行 经历过这种情况的 10 次左右是这样。 I can't find anything in the javadocs to say either way.
是的,AspectJ JavaDocs 是出了名的简洁。但出于许多逻辑原因,Vasan 所说的是正确的:JoinPoint.getArgs()
的数组元素的顺序确实对应于方法参数的顺序。
查看代码库,您会发现几个指标表明我所说的是正确的,例如
GetInfo
example 依赖于 JoinPoint.getArgs()
、CodeSignature.getParameterNames()
和 CodeSignature.getParameterTypes()
.
[=40 的相同参数顺序=]
JoinPointImpl
,JoinPoint
接口的默认实现,通过arraycopy
复制原方法的参数数组,即顺序不变。为什么会有人想要改变它?
JoinPointImplTest
显式测试参数的顺序并将原始方法的参数与连接点的参数进行比较。
它总是有序的。知道您甚至可以创建一个映射,其中键是参数名称,值是参数值。顺序始终相同
String[] keys = ((MethodSignature) jp.getSignature()).getParameterNames();
Object[] values = jp.getArgs();
Map<String, Object> params = new HashMap<>();
IntStream.range(0, keys.length).boxed().forEach(i -> params.put(keys[i], values[i]));
说我有这个方法:
public void exampleMethod(String myString, Integer myInteger, Object myObject){}
如果我有一个 @Around
方面,并且我调用 ProceedingJoinPoint.getArgs()
它是否总是 return 一个按签名顺序排序的数组?像这样?
public void aspectMethod(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object[] args = proceedingJoinPoint.getArgs();
args[0]; // String myString?
args[1]; // Integer myInteger?
args[2]; // Object myObject?
}
它看起来确实是确定性的,至少在我 运行 经历过这种情况的 10 次左右是这样。 I can't find anything in the javadocs to say either way.
是的,AspectJ JavaDocs 是出了名的简洁。但出于许多逻辑原因,Vasan 所说的是正确的:JoinPoint.getArgs()
的数组元素的顺序确实对应于方法参数的顺序。
查看代码库,您会发现几个指标表明我所说的是正确的,例如
[=40 的相同参数顺序=]GetInfo
example 依赖于JoinPoint.getArgs()
、CodeSignature.getParameterNames()
和CodeSignature.getParameterTypes()
.JoinPointImpl
,JoinPoint
接口的默认实现,通过arraycopy
复制原方法的参数数组,即顺序不变。为什么会有人想要改变它?JoinPointImplTest
显式测试参数的顺序并将原始方法的参数与连接点的参数进行比较。
它总是有序的。知道您甚至可以创建一个映射,其中键是参数名称,值是参数值。顺序始终相同
String[] keys = ((MethodSignature) jp.getSignature()).getParameterNames();
Object[] values = jp.getArgs();
Map<String, Object> params = new HashMap<>();
IntStream.range(0, keys.length).boxed().forEach(i -> params.put(keys[i], values[i]));