You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/12/14 17:31:17 UTC

[groovy] branch master updated: Tweak Java9 vmplugin

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e8958d7  Tweak Java9 vmplugin
e8958d7 is described below

commit e8958d7eb07ae36ebf2c8900bd3714a0fc4c1035
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Dec 15 00:40:30 2019 +0800

    Tweak Java9 vmplugin
---
 .../org/codehaus/groovy/reflection/ReflectionUtils.java | 15 +++++++++++++--
 .../java/org/codehaus/groovy/vmplugin/v9/Java9.java     | 17 ++++++++++-------
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/reflection/ReflectionUtils.java b/src/main/java/org/codehaus/groovy/reflection/ReflectionUtils.java
index 4a5fd6c..aba0d55 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ReflectionUtils.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ReflectionUtils.java
@@ -35,6 +35,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Function;
 
 /**
  * This class contains utility methods to determine which class called the
@@ -128,11 +129,21 @@ public class ReflectionUtils {
         }
     }
 
-    public static List<Method> getMethods(Class type, String name, Class<?>... parameterTypes) {
+    private static final Function<Class<?>, Method[]> GET_DECLARED_METHODS = Class::getDeclaredMethods;
+    public static List<Method> getDeclaredMethods(Class<?> type, String name, Class<?>... parameterTypes) {
+        return doGetMethods(type, name, parameterTypes, GET_DECLARED_METHODS);
+    }
+
+    private static final Function<Class<?>, Method[]> GET_METHODS = Class::getMethods;
+    public static List<Method> getMethods(Class<?> type, String name, Class<?>... parameterTypes) {
+        return doGetMethods(type, name, parameterTypes, GET_METHODS);
+    }
+
+    private static List<Method> doGetMethods(Class<?> type, String name, Class<?>[] parameterTypes, Function<? super Class<?>, ? extends Method[]> f) {
         List<Method> methodList = new LinkedList<>();
 
         out:
-        for (Method m : type.getMethods()) {
+        for (Method m : f.apply(type)) {
             if (!m.getName().equals(name)) {
                 continue;
             }
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
index 9dcadb7..806191d 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v9/Java9.java
@@ -222,7 +222,7 @@ public class Java9 extends Java8 {
             classList.add(0, theClass);
 
             for (Class<?> sc : classList) {
-                Optional<CachedMethod> optionalMetaMethod = getAccessibleMetaMethod(metaMethod, params, caller, sc);
+                Optional<CachedMethod> optionalMetaMethod = getAccessibleMetaMethod(metaMethod, params, caller, sc, true);
                 if (optionalMetaMethod.isPresent()) {
                     return optionalMetaMethod.get();
                 }
@@ -235,7 +235,7 @@ public class Java9 extends Java8 {
             // GROOVY-9081 Sub-class derives the protected members from public class, "Invoke the members on the sub class instances"
             // e.g. StringBuilder sb = new StringBuilder(); sb.setLength(0);
             // `setLength` is the method of `AbstractStringBuilder`, which is `package-private`
-            Optional<CachedMethod> optionalMetaMethod = getAccessibleMetaMethod(metaMethod, params, caller, theClass);
+            Optional<CachedMethod> optionalMetaMethod = getAccessibleMetaMethod(metaMethod, params, caller, theClass, false);
             if (optionalMetaMethod.isPresent()) {
                 return optionalMetaMethod.get();
             }
@@ -257,8 +257,8 @@ public class Java9 extends Java8 {
         return metaMethod;
     }
 
-    private Optional<CachedMethod> getAccessibleMetaMethod(CachedMethod metaMethod, Class<?>[] params, Class<?> caller, Class<?> sc) {
-        List<CachedMethod> metaMethodList = getMetaMethods(metaMethod, params, sc);
+    private Optional<CachedMethod> getAccessibleMetaMethod(CachedMethod metaMethod, Class<?>[] params, Class<?> caller, Class<?> sc, boolean declared) {
+        List<CachedMethod> metaMethodList = getMetaMethods(metaMethod, params, sc, declared);
         for (CachedMethod mm : metaMethodList) {
             if (checkAccessible(caller, mm.getDeclaringClass().getTheClass(), mm.getModifiers(), false)) {
                 return Optional.of(mm);
@@ -267,9 +267,12 @@ public class Java9 extends Java8 {
         return Optional.empty();
     }
 
-    private static List<CachedMethod> getMetaMethods(CachedMethod metaMethod, Class<?>[] params, Class<?> sc) {
-        List<Method> optionalMethod = ReflectionUtils.getMethods(sc, metaMethod.getName(), params);
-        return optionalMethod.stream().map(CachedMethod::new).collect(Collectors.toList());
+    private static List<CachedMethod> getMetaMethods(CachedMethod metaMethod, Class<?>[] params, Class<?> sc, boolean declared) {
+        String metaMethodName = metaMethod.getName();
+        List<Method> optionalMethodList = declared
+                                            ? ReflectionUtils.getDeclaredMethods(sc, metaMethodName, params)
+                                            : ReflectionUtils.getMethods(sc, metaMethodName, params);
+        return optionalMethodList.stream().map(CachedMethod::new).collect(Collectors.toList());
     }
 
     @Override