是否订购了JoinPoint.getArgs()?

时间:2018-05-03 05:09:32

标签: java aspectj spring-aop

说我有这个方法:

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

2 个答案:

答案 0 :(得分:1)

是的,AspectJ JavaDocs是众所周知的简洁。但出于许多逻辑原因, Vasan 所说的是真的: JoinPoint.getArgs()的数组元素的顺序确实对应于方法参数的顺序。

查看代码库,您会发现我所说的几个指标是正确的,例如

  • GetInfo example依赖于JoinPoint.getArgs()CodeSignature.getParameterNames()CodeSignature.getParameterTypes()的相同参数顺序。

  • JoinPointImplJoinPoint接口的默认实现,通过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]));