说我有这个方法:
public void exampleMethod(String myString, Integer myInteger, Object myObject){}
如果我有一个Aspect @Around
,并且我调用ProceedingJoinPoint.getArgs()
它是否会返回按签名顺序排序的数组?喜欢这个?
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
答案 0 :(得分:1)
是的,AspectJ JavaDocs是众所周知的简洁。但出于许多逻辑原因, Vasan 所说的是真的: JoinPoint.getArgs()
的数组元素的顺序确实对应于方法参数的顺序。
查看代码库,您会发现我所说的几个指标是正确的,例如
GetInfo
example依赖于JoinPoint.getArgs()
,CodeSignature.getParameterNames()
和CodeSignature.getParameterTypes()
的相同参数顺序。
JoinPointImpl
,JoinPoint
接口的默认实现,通过arraycopy
复制原始方法的参数数组,即顺序保持不变。为什么有人想要改变呢?
JoinPointImplTest
显式测试参数的顺序,并将原始方法的参数与连接点的参数进行比较。
答案 1 :(得分:1)
总是订购。知道你甚至可以创建一个地图,其中键是参数名称和值是参数值。订单总是相同的
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]));