diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java index 346fe83c617..23d3438e2cd 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,17 +33,15 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** - * Implementation of AspectJ ProceedingJoinPoint interface - * wrapping an AOP Alliance MethodInvocation. + * An implementation of the AspectJ {@link ProceedingJoinPoint} interface + * wrapping an AOP Alliance {@link org.aopalliance.intercept.MethodInvocation}. * - *

Note: the {@code getThis()} method returns the current Spring AOP proxy. + *

Note: The {@code getThis()} method returns the current Spring AOP proxy. * The {@code getTarget()} method returns the current Spring AOP target (which may be - * {@code null} if there is no target), and is a plain POJO without any advice. - * If you want to call the object and have the advice take effect, use - * {@code getThis()}. A common example is casting the object to an - * introduced interface in the implementation of an introduction. - * - *

Of course there is no such distinction between target and proxy in AspectJ. + * {@code null} if there is no target instance) as a plain POJO without any advice. + * If you want to call the object and have the advice take effect, use {@code getThis()}. + * A common example is casting the object to an introduced interface in the implementation of + * an introduction. There is no such distinction between target and proxy in AspectJ itself. * * @author Rod Johnson * @author Juergen Hoeller @@ -58,7 +56,7 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, private final ProxyMethodInvocation methodInvocation; @Nullable - private Object[] defensiveCopyOfArgs; + private Object[] args; /** Lazily initialized signature object */ @Nullable @@ -79,6 +77,7 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, this.methodInvocation = methodInvocation; } + @Override public void set$AroundClosure(AroundClosure aroundClosure) { throw new UnsupportedOperationException(); @@ -120,12 +119,10 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, @Override public Object[] getArgs() { - if (this.defensiveCopyOfArgs == null) { - Object[] argsSource = this.methodInvocation.getArguments(); - this.defensiveCopyOfArgs = new Object[argsSource.length]; - System.arraycopy(argsSource, 0, this.defensiveCopyOfArgs, 0, argsSource.length); + if (this.args == null) { + this.args = this.methodInvocation.getArguments().clone(); } - return this.defensiveCopyOfArgs; + return this.args; } @Override @@ -133,7 +130,7 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, if (this.signature == null) { this.signature = new MethodSignatureImpl(); } - return signature; + return this.signature; } @Override