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 的相同参数顺序=]
  • JoinPointImplJoinPoint接口的默认实现,通过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]));