You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2024/01/22 21:57:52 UTC

(groovy) branch GROOVY_4_0_X updated: GROOVY-11293: ensure `isVargsMethod` initialized before return

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 134e987dfb GROOVY-11293: ensure `isVargsMethod` initialized before return
134e987dfb is described below

commit 134e987dfbadce9c7378f483b72904885e079788
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Jan 22 14:46:52 2024 -0600

    GROOVY-11293: ensure `isVargsMethod` initialized before return
    
    4_0_X backport
---
 .../groovy/reflection/GeneratedMetaMethod.java     |   2 +-
 .../codehaus/groovy/reflection/ParameterTypes.java | 165 +++++++++------------
 .../runtime/dgmimpl/NumberNumberMetaMethod.java    |   6 +-
 .../dgmimpl/arrays/ArrayGetAtMetaMethod.java       |   3 +-
 .../runtime/dgmimpl/arrays/ArrayMetaMethod.java    |   4 +-
 .../dgmimpl/arrays/ArrayPutAtMetaMethod.java       |  10 ++
 .../arrays/BooleanArrayGetAtMetaMethod.java        |   4 +-
 .../arrays/BooleanArrayPutAtMetaMethod.java        |  10 +-
 .../dgmimpl/arrays/ByteArrayGetAtMetaMethod.java   |   4 +-
 .../dgmimpl/arrays/ByteArrayPutAtMetaMethod.java   |  10 +-
 .../arrays/CharacterArrayGetAtMetaMethod.java      |   4 +-
 .../arrays/CharacterArrayPutAtMetaMethod.java      |  10 +-
 .../dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java |   4 +-
 .../dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java |  10 +-
 .../dgmimpl/arrays/FloatArrayGetAtMetaMethod.java  |   4 +-
 .../dgmimpl/arrays/FloatArrayPutAtMetaMethod.java  |  10 +-
 .../arrays/IntegerArrayGetAtMetaMethod.java        |   4 +-
 .../arrays/IntegerArrayPutAtMetaMethod.java        |  10 +-
 .../dgmimpl/arrays/LongArrayGetAtMetaMethod.java   |   4 +-
 .../dgmimpl/arrays/LongArrayPutAtMetaMethod.java   |  10 +-
 .../dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java |   6 +-
 .../dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java |  12 +-
 .../dgmimpl/arrays/ShortArrayGetAtMetaMethod.java  |   4 +-
 .../dgmimpl/arrays/ShortArrayPutAtMetaMethod.java  |  10 +-
 .../runtime/metaclass/TransformMetaMethod.java     |   4 +-
 .../groovy/reflection/CachedMethodTest.groovy      |  21 ++-
 26 files changed, 147 insertions(+), 198 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java b/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java
index f373e1c08f..ebb72baf2d 100644
--- a/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/reflection/GeneratedMetaMethod.java
@@ -42,10 +42,10 @@ public abstract class GeneratedMetaMethod extends MetaMethod {
     private final Class returnType;
 
     public GeneratedMetaMethod(String name, CachedClass declaringClass, Class returnType, Class[] parameters) {
+        super(parameters);
         this.name = name;
         this.declaringClass = declaringClass;
         this.returnType = returnType;
-        nativeParamTypes = parameters;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java b/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java
index 0c13bac0e0..d608412e9e 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ParameterTypes.java
@@ -27,9 +27,9 @@ import org.codehaus.groovy.runtime.wrappers.Wrapper;
 import java.lang.reflect.Array;
 
 public class ParameterTypes {
-    protected volatile Class[] nativeParamTypes;
-    protected volatile CachedClass[] parameterTypes;
 
+    protected volatile CachedClass[] parameterTypes;
+    protected volatile Class[] nativeParamTypes;
     protected boolean isVargsMethod;
 
     public ParameterTypes() {
@@ -52,8 +52,8 @@ public class ParameterTypes {
         }
     }
 
-    public ParameterTypes(CachedClass[] parameterTypes) {
-        setParametersTypes(parameterTypes);
+    public ParameterTypes(CachedClass[] pt) {
+        setParametersTypes(pt);
     }
 
     protected final void setParametersTypes(CachedClass[] pt) {
@@ -65,25 +65,23 @@ public class ParameterTypes {
         if (parameterTypes == null) {
             getParametersTypes0();
         }
-
         return parameterTypes;
     }
 
     private synchronized void getParametersTypes0() {
-        if (parameterTypes != null)
-            return;
-
-        Class[] npt = nativeParamTypes == null ? getPT() : nativeParamTypes;
-        if (npt.length == 0) {
-            nativeParamTypes = MetaClassHelper.EMPTY_TYPE_ARRAY;
-            setParametersTypes(CachedClass.EMPTY_ARRAY);
-        } else {
-            CachedClass[] pt = new CachedClass[npt.length];
-            for (int i = 0; i != npt.length; ++i)
-                pt[i] = ReflectionCache.getCachedClass(npt[i]);
-
-            nativeParamTypes = npt;
-            setParametersTypes(pt);
+        if (parameterTypes == null) {
+            Class[] npt = nativeParamTypes == null ? getPT() : nativeParamTypes;
+            if (npt.length == 0) {
+                nativeParamTypes = MetaClassHelper.EMPTY_TYPE_ARRAY;
+                setParametersTypes(CachedClass.EMPTY_ARRAY);
+            } else {
+                CachedClass[] pt = new CachedClass[npt.length];
+                for (int i = 0; i != npt.length; ++i) {
+                    pt[i] = ReflectionCache.getCachedClass(npt[i]);
+                }
+                nativeParamTypes = npt;
+                setParametersTypes(pt);
+            }
         }
     }
 
@@ -95,18 +93,18 @@ public class ParameterTypes {
     }
 
     private synchronized void getNativeParameterTypes0() {
-        if (nativeParamTypes != null)
-            return;
-
-        Class[] npt;
-        if (parameterTypes != null) {
-            npt = new Class[parameterTypes.length];
-            for (int i = 0; i != parameterTypes.length; ++i) {
-                npt[i] = parameterTypes[i].getTheClass();
+        if (nativeParamTypes == null) {
+            Class[] npt;
+            if (parameterTypes == null) {
+                npt = getPT();
+            } else {
+                npt = new Class[parameterTypes.length];
+                for (int i = 0; i != parameterTypes.length; ++i) {
+                    npt[i] = parameterTypes[i].getTheClass();
+                }
             }
-        } else
-            npt = getPT();
-        nativeParamTypes = npt;
+            nativeParamTypes = npt;
+        }
     }
 
     protected Class[] getPT() {
@@ -114,64 +112,54 @@ public class ParameterTypes {
     }
 
     public boolean isVargsMethod() {
+        if (parameterTypes == null) {
+            getParametersTypes0(); // GROOVY-11293
+        }
         return isVargsMethod;
     }
 
     public boolean isVargsMethod(Object[] arguments) {
-        // Uncomment if at some point this method can be called before parameterTypes initialized
-        // getParameterTypes();
-        if (!isVargsMethod)
-            return false;
-
-        final int lenMinus1 = parameterTypes.length - 1;
-        // -1 because the varg part is optional
-        if (lenMinus1 == arguments.length) return true;
-        if (lenMinus1 > arguments.length) return false;
-        if (arguments.length > parameterTypes.length) return true;
-
-        // only case left is arguments.length == parameterTypes.length
-        Object last = arguments[arguments.length - 1];
-        if (last == null) return true;
-        Class clazz = last.getClass();
-        return !clazz.equals(parameterTypes[lenMinus1].getTheClass());
-
+        if (isVargsMethod()) {
+            int aCount = arguments.length;
+            int pCount = parameterTypes.length;
+            if (aCount > pCount || aCount == pCount-1) { // too many or too few?
+                return true;
+            }
+            if (aCount == pCount) {
+                Object last = arguments[aCount-1]; // is null or different type?
+                return last == null || !last.getClass().equals(parameterTypes[pCount-1].getTheClass());
+            }
+        }
+        return false;
     }
 
-    public final Object[] coerceArgumentsToClasses(Object[] argumentArray) {
-        // Uncomment if at some point this method can be called before parameterTypes initialized
-        // getParameterTypes();
-        argumentArray = correctArguments(argumentArray);
-
-        final CachedClass[] pt = parameterTypes;
-        final int len = argumentArray.length;
-        for (int i = 0; i < len; i++) {
-            final Object argument = argumentArray[i];
+    public final Object[] coerceArgumentsToClasses(Object[] arguments) {
+        arguments = correctArguments(arguments);
+        for (int i = 0; i < arguments.length; ++i) {
+            final Object argument = arguments[i];
             if (argument != null) {
-                argumentArray[i] = pt[i].coerceArgument(argument);
+                arguments[i] = parameterTypes[i].coerceArgument(argument);
             }
         }
-        return argumentArray;
+        return arguments;
     }
 
-    public Object[] correctArguments(Object[] argumentArray) {
-        // correct argumentArray's length
-        if (argumentArray == null) {
-            return MetaClassHelper.EMPTY_ARRAY;
+    public Object[] correctArguments(Object[] arguments) {
+        if (arguments == null) {
+            arguments = MetaClassHelper.EMPTY_ARRAY;
         }
 
-        final CachedClass[] pt = getParameterTypes();
-        if (pt.length == 1 && argumentArray.length == 0) {
-            if (isVargsMethod)
-                return new Object[]{Array.newInstance(pt[0].getTheClass().getComponentType(), 0)};
-            else
-                return MetaClassHelper.ARRAY_WITH_NULL;
+        CachedClass[] pt = getParameterTypes();
+        if (pt.length == 1 && arguments.length == 0) {
+            if (!isVargsMethod()) return MetaClassHelper.ARRAY_WITH_NULL;
+            return new Object[]{Array.newInstance(pt[0].getTheClass().getComponentType(), 0)};
         }
 
-        if (isVargsMethod && isVargsMethod(argumentArray)) {
-            return fitToVargs(argumentArray, pt);
+        if (isVargsMethod(arguments)) {
+            return fitToVargs(arguments, pt);
         }
 
-        return argumentArray;
+        return arguments;
     }
 
     /**
@@ -226,11 +214,11 @@ public class ParameterTypes {
         }
     }
 
-    private static Object makeCommonArray(Object[] arguments, int offset, Class baseClass) {
-        Object[] result = (Object[]) Array.newInstance(baseClass, arguments.length - offset);
-        for (int i = offset; i < arguments.length; i++) {
+    private static Object makeCommonArray(Object[] arguments, int offset, Class<?> baseType) {
+        Object[] result = (Object[]) Array.newInstance(baseType, arguments.length - offset);
+        for (int i = offset; i < arguments.length; ++i) {
             Object v = arguments[i];
-            v = DefaultTypeTransformation.castToType(v, baseClass);
+            v = DefaultTypeTransformation.castToType(v, baseType);
             result[i - offset] = v;
         }
         return result;
@@ -241,7 +229,7 @@ public class ParameterTypes {
         CachedClass[] pt = getParameterTypes();
         final int nArguments = argumentTypes.length, nParameters = pt.length, nthParameter = nParameters - 1;
 
-        if (isVargsMethod && nArguments >= nthParameter)
+        if (isVargsMethod() && nArguments >= nthParameter)
             return isValidVargsMethod(argumentTypes, pt, nthParameter);
         else if (nArguments == nParameters)
             return isValidExactMethod(argumentTypes, pt);
@@ -253,7 +241,7 @@ public class ParameterTypes {
     private static boolean isValidExactMethod(Class[] arguments, CachedClass[] pt) {
         // let's check the parameter types match
         int size = pt.length;
-        for (int i = 0; i < size; i++) {
+        for (int i = 0; i < size; ++i) {
             if (!pt[i].isAssignableFrom(arguments[i])) {
                 return false;
             }
@@ -268,7 +256,7 @@ public class ParameterTypes {
         if (size != parameterTypes.length)
             return false;
 
-        for (int i = 0; i < size; i++) {
+        for (int i = 0; i < size; ++i) {
             final Object arg = args[i];
             if (arg != null && !parameterTypes[i].isAssignableFrom(arg.getClass())) {
                 return false;
@@ -284,8 +272,8 @@ public class ParameterTypes {
         if (size != parameterTypes.length)
             return false;
 
-        for (int i = 0; i < size; i++) {
-            final Class arg = args[i];
+        for (int i = 0; i < size; ++i) {
+            final Class<?> arg = args[i];
             if (arg != null && !parameterTypes[i].isAssignableFrom(arg)) {
                 return false;
             }
@@ -305,7 +293,7 @@ public class ParameterTypes {
 
         // check direct match
         if (argumentTypes.length == parameterTypes.length) {
-            Class argumentType = argumentTypes[nthParameter];
+            Class<?> argumentType = argumentTypes[nthParameter];
             if (arrayType.isAssignableFrom(argumentType) || (argumentType.isArray()
                     && componentType.isAssignableFrom(argumentType.getComponentType()))) {
                 return true;
@@ -337,7 +325,7 @@ public class ParameterTypes {
             CachedClass componentType = ReflectionCache.getCachedClass(arrayType.getTheClass().getComponentType());
             // check direct match
             if (nArguments == parameterTypes.length) {
-                Class argumentType = getArgClass(arguments[nthParameter]);
+                Class<?> argumentType = getArgClass(arguments[nthParameter]);
                 if (arrayType.isAssignableFrom(argumentType) || (argumentType.isArray()
                         && componentType.isAssignableFrom(argumentType.getComponentType()))) {
                     return true;
@@ -363,16 +351,7 @@ public class ParameterTypes {
         return false;
     }
 
-    private static Class getArgClass(Object arg) {
-        Class cls;
-        if (arg == null) {
-            cls = null;
-        } else {
-            if (arg instanceof Wrapper) {
-                cls = ((Wrapper) arg).getType();
-            } else
-                cls = arg.getClass();
-        }
-        return cls;
+    private static Class<?> getArgClass(final Object arg) {
+        return arg == null ? null : (arg instanceof Wrapper ? ((Wrapper) arg).getType() : arg.getClass());
     }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java
index 57f2cd5f78..f9073aa38e 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java
@@ -30,11 +30,11 @@ import org.codehaus.groovy.runtime.typehandling.NumberMath;
 import java.lang.reflect.Modifier;
 
 public abstract class NumberNumberMetaMethod extends CallSiteAwareMetaMethod {
-    private static final CachedClass    NUMBER_CLASS = ReflectionCache.getCachedClass(Number.class);
-    private static final CachedClass [] NUMBER_CLASS_ARR = new CachedClass[] { NUMBER_CLASS };
+    private static final CachedClass   NUMBER_CLASS = ReflectionCache.getCachedClass(Number.class);
+    private static final CachedClass[] NUMBER_CLASS_ARR = {NUMBER_CLASS};
 
     protected NumberNumberMetaMethod() {
-        parameterTypes = NUMBER_CLASS_ARR;
+        setParametersTypes(NUMBER_CLASS_ARR);
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java
index 7994b4e3f9..77aa3f65c9 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayGetAtMetaMethod.java
@@ -19,8 +19,9 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 public abstract class ArrayGetAtMetaMethod extends ArrayMetaMethod {
+
     protected ArrayGetAtMetaMethod() {
-        parameterTypes = INTEGER_CLASS_ARR;
+        setParametersTypes(INTEGER_CLASS_ARR);
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java
index 630fe6f551..c5cf781a65 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java
@@ -25,8 +25,8 @@ import org.codehaus.groovy.runtime.callsite.CallSiteAwareMetaMethod;
 import java.lang.reflect.Modifier;
 
 public abstract class ArrayMetaMethod extends CallSiteAwareMetaMethod {
-    protected static final CachedClass INTEGER_CLASS = ReflectionCache.getCachedClass(Integer.class);
-    protected static final CachedClass[] INTEGER_CLASS_ARR = new CachedClass[]{INTEGER_CLASS};
+    protected static final CachedClass   INTEGER_CLASS = ReflectionCache.getCachedClass(Integer.class);
+    protected static final CachedClass[] INTEGER_CLASS_ARR = {INTEGER_CLASS};
 
     protected static int normaliseIndex(int i, int size) {
         int temp = i;
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java
index 41fa07027c..1cd27762f2 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayPutAtMetaMethod.java
@@ -18,7 +18,17 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
+import org.codehaus.groovy.reflection.CachedClass;
+
+import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_CLASS;
+
 public abstract class ArrayPutAtMetaMethod extends ArrayMetaMethod {
+    private static final CachedClass[] PARAM_TYPES = {INTEGER_CLASS, OBJECT_CLASS};
+
+    protected ArrayPutAtMetaMethod() {
+        setParametersTypes(PARAM_TYPES);
+    }
+
     @Override
     public String getName() {
         return "putAt";
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java
index 4244b2ad08..ce9132f868 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class BooleanArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(boolean[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(boolean[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class BooleanArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java
index 4739fd6383..eea5fd6c38 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java
@@ -26,17 +26,11 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class BooleanArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(boolean[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public BooleanArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(boolean[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java
index 4e5af49e70..6d1f028889 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class ByteArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(byte[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(byte[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class ByteArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java
index 2c79b481d4..8952f1658f 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java
@@ -26,17 +26,11 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class ByteArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(byte[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public ByteArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(byte[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java
index 482d3911b9..03389270a0 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class CharacterArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(char[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(char[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class CharacterArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java
index 4371c47e8c..88fb05bea1 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java
@@ -27,17 +27,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
 public class CharacterArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(char[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public CharacterArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(char[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java
index 692abfbcef..0e1014d912 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class DoubleArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(double[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(double[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class DoubleArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java
index f89a2d03a3..e3db4a9fda 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java
@@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
 public class DoubleArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(double[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public DoubleArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(double[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java
index 5caa586505..ff5badb50b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class FloatArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(float[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(float[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class FloatArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java
index ebbf2e8f59..5cb0abcaec 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java
@@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
 public class FloatArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(float[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public FloatArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(float[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java
index 30c4ee5cf8..0863753f7d 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class IntegerArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(int[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(int[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class IntegerArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java
index 34f114d0ac..2424e9aa5b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java
@@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
 public class IntegerArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(int[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public IntegerArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(int[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java
index f31ef1c7dc..231a9d887f 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class LongArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(long[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(long[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class LongArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java
index 7d753728b7..6e8afff874 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java
@@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
 public class LongArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(long[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public LongArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(long[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java
index 011341f501..e2e9fc8464 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java
@@ -21,12 +21,12 @@ package org.codehaus.groovy.runtime.dgmimpl.arrays;
 import groovy.lang.MetaClassImpl;
 import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
-import org.codehaus.groovy.reflection.ReflectionCache;
 import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
+import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_ARRAY_CLASS;
+
 public class ObjectArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass OBJECT_ARR_CLASS = ReflectionCache.OBJECT_ARRAY_CLASS;
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class ObjectArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return OBJECT_ARR_CLASS;
+        return OBJECT_ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
index 9cb7c746ed..208b161955 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
@@ -22,23 +22,17 @@ import groovy.lang.GString;
 import groovy.lang.MetaClassImpl;
 import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
-import org.codehaus.groovy.reflection.ReflectionCache;
 import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
-public class ObjectArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.getCachedClass(Object.class);
-    private static final CachedClass OBJECT_ARR_CLASS = ReflectionCache.OBJECT_ARRAY_CLASS;
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
+import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_ARRAY_CLASS;
 
-    public ObjectArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+public class ObjectArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return OBJECT_ARR_CLASS;
+        return OBJECT_ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java
index e85e212a70..c3e623483a 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java
@@ -26,7 +26,7 @@ import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class ShortArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(short[].class);
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(short[].class);
 
     @Override
     public Class getReturnType() {
@@ -35,7 +35,7 @@ public class ShortArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java
index 6083b24153..aad4e9a29a 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java
@@ -28,17 +28,11 @@ import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
 public class ShortArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
-    private static final CachedClass OBJECT_CLASS = ReflectionCache.OBJECT_CLASS;
-    private static final CachedClass ARR_CLASS = ReflectionCache.getCachedClass(short[].class);
-    private static final CachedClass[] PARAM_CLASS_ARR = new CachedClass[]{INTEGER_CLASS, OBJECT_CLASS};
-
-    public ShortArrayPutAtMetaMethod() {
-        parameterTypes = PARAM_CLASS_ARR;
-    }
+    private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(short[].class);
 
     @Override
     public final CachedClass getDeclaringClass() {
-        return ARR_CLASS;
+        return ARRAY_CLASS;
     }
 
     @Override
diff --git a/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java
index 64a1eb6617..2c212021b8 100644
--- a/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/TransformMetaMethod.java
@@ -29,9 +29,9 @@ public class TransformMetaMethod extends MetaMethod {
     private final MetaMethod metaMethod;
 
     public TransformMetaMethod(final MetaMethod metaMethod) {
-        this.metaMethod = metaMethod;
+        super(metaMethod.getNativeParameterTypes());
         setParametersTypes(metaMethod.getParameterTypes());
-        nativeParamTypes = metaMethod.getNativeParameterTypes();
+        this.metaMethod = metaMethod;
     }
 
     @Override
diff --git a/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy b/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy
index eb552519c7..8d9852b361 100644
--- a/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy
+++ b/src/test/org/codehaus/groovy/reflection/CachedMethodTest.groovy
@@ -18,10 +18,23 @@
  */
 package org.codehaus.groovy.reflection
 
-import groovy.test.GroovyTestCase
+import org.junit.Test
 
-class CachedMethodTest extends GroovyTestCase {
-    void testCachedMethodCompareTo() {
-        assert String.metaClass.methods.size() == String.metaClass.methods.unique().size()
+final class CachedMethodTest {
+
+    @Test
+    void testCompareTo() {
+        int methodCount = String.metaClass.methods.size()
+        int uniqueCount = String.metaClass.methods.unique().size()
+
+        assert methodCount == uniqueCount
+    }
+
+    // GROOVY-11293
+    @Test
+    void testIsVargsMethod() {
+        def cachedMethod = new CachedMethod(String.getMethod('join', CharSequence, CharSequence[]))
+
+        assert cachedMethod.isVargsMethod()
     }
 }