说我有这种方法:
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。
最佳答案
是的,AspectJ JavaDocs非常简洁。但是出于多种逻辑原因,Vasan所说的是正确的: JoinPoint.getArgs()
的数组元素的顺序确实与方法参数的顺序相对应。
查看代码库,您会发现几个指标,这些指标表明我所说的是正确的,例如
GetInfo
example依赖于JoinPoint.getArgs()
,CodeSignature.getParameterNames()
和CodeSignature.getParameterTypes()
的相同参数顺序。 JoinPointImpl
是JoinPoint
接口的默认实现,它通过arraycopy
复制原始方法的参数数组,即顺序保持不变。为什么有人要更改它呢? JoinPointImplTest
显式测试参数的顺序,并将原始方法的参数与连接点的参数进行比较。 关于java - JoinPoint.getArgs()是否有序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50147340/