# HG changeset patch # User hannesw # Date 1543588767 -3600 # Node ID f468232c6147005c5572ef34e03fa2adc1d67da3 # Parent 436097b038a15707ef68ceb2fe90fdf457a8298e 8210943: Hiding of inner classes not resolved properly Reviewed-by: attila, jlaskey diff -r 436097b038a1 -r f468232c6147 src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java --- a/src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java Fri Nov 30 11:40:48 2018 +0100 +++ b/src/jdk.dynalink/share/classes/jdk/dynalink/beans/AccessibleMembersLookup.java Fri Nov 30 15:39:27 2018 +0100 @@ -65,9 +65,8 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.LinkedHashSet; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.Set; /** * Utility class for discovering accessible methods and inner classes. Normally, a public member declared on a class is @@ -78,7 +77,7 @@ */ class AccessibleMembersLookup { private final Map methods; - private final Set> innerClasses; + private final Map> innerClasses; private final boolean instance; /** @@ -89,7 +88,7 @@ */ AccessibleMembersLookup(final Class clazz, final boolean instance) { this.methods = new HashMap<>(); - this.innerClasses = new LinkedHashSet<>(); + this.innerClasses = new LinkedHashMap<>(); this.instance = instance; lookupAccessibleMembers(clazz); } @@ -110,7 +109,7 @@ } Class[] getInnerClasses() { - return innerClasses.toArray(new Class[0]); + return innerClasses.values().toArray(new Class[0]); } /** @@ -216,7 +215,8 @@ // NOTE: getting inner class objects through getClasses() does not resolve them, so if those classes // were not yet loaded, they'll only get loaded in a non-resolved state; no static initializers for // them will trigger just by doing this. - innerClasses.add(innerClass); + // Don't overwrite an inner class with an inherited inner class with the same name. + innerClasses.putIfAbsent(innerClass.getSimpleName(), innerClass); } } else { searchSuperTypes = true; diff -r 436097b038a1 -r f468232c6147 test/nashorn/src/jdk/dynalink/beans/test/BeansLinkerTest.java --- a/test/nashorn/src/jdk/dynalink/beans/test/BeansLinkerTest.java Fri Nov 30 11:40:48 2018 +0100 +++ b/test/nashorn/src/jdk/dynalink/beans/test/BeansLinkerTest.java Fri Nov 30 15:39:27 2018 +0100 @@ -47,6 +47,7 @@ import jdk.dynalink.NamespaceOperation; import jdk.dynalink.NoSuchDynamicMethodException; import jdk.dynalink.Operation; +import jdk.dynalink.beans.StaticClass; import jdk.dynalink.support.SimpleRelinkableCallSite; import org.testng.Assert; import org.testng.annotations.Test; @@ -224,6 +225,25 @@ }); } + public static class A { + public static class Inner {} + } + + public static class B extends A { + public static class Inner {} + } + + @Test + public static void testInnerClassGetter() { + Object inner1 = call(GET.withNamespace(PROPERTY), StaticClass.forClass(A.class), "Inner"); + Assert.assertTrue(inner1 instanceof StaticClass); + Assert.assertEquals(A.Inner.class, ((StaticClass) inner1).getRepresentedClass()); + + Object inner2 = call(GET.withNamespace(PROPERTY), StaticClass.forClass(B.class), "Inner"); + Assert.assertTrue(inner2 instanceof StaticClass); + Assert.assertEquals(B.Inner.class, ((StaticClass) inner2).getRepresentedClass()); + } + private static void expectNoSuchDynamicMethodException(final Runnable r) { try { r.run();