说我有这种方法:

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/

    10-10 12:27