Является ли JoinPoint.getArgs () заказанным? - PullRequest
0 голосов
/ 03 мая 2018

Скажите, у меня есть этот метод:

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 раз, когда я проходил этот сценарий. Я не могу найти ничего в javadocs, чтобы сказать в любом случае .

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Это всегда заказано. Зная, что вы даже можете создать карту, где ключи - это имена параметров, а значения - значения параметров. Порядок всегда один и тот же

    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]));
0 голосов
/ 03 мая 2018

Да, AspectJ JavaDocs общеизвестно лаконичен. Но по многим логическим причинам сказанное Vasan верно: Порядок элементов массива JoinPoint.getArgs() соответствует порядку параметров метода.

Глядя на кодовую базу, вы обнаруживаете несколько индикаторов того, что я сказал правду, например

  • Пример GetInfo опирается на тот же порядок аргументов для JoinPoint.getArgs(), CodeSignature.getParameterNames() и CodeSignature.getParameterTypes().

  • JoinPointImpl, реализация по умолчанию интерфейса JoinPoint, копирует массив параметров исходного метода с помощью arraycopy, то есть порядок остается неизменным. Зачем кому-то все-таки менять это?

  • JoinPointImplTest явно проверяет порядок аргументов и сравнивает аргументы исходного метода с аргументами точки соединения.

...