--- old/test/jdk/java/lang/invoke/VarHandles/accessibility/TestFieldLookupAccessibility.java 2019-03-26 17:17:47.730448509 +0000 +++ new/test/jdk/java/lang/invoke/VarHandles/accessibility/TestFieldLookupAccessibility.java 2019-03-26 17:17:47.498444645 +0000 @@ -22,7 +22,7 @@ */ /* @test - * @bug 8152645 + * @bug 8152645 8216558 * @summary test field lookup accessibility of MethodHandles and VarHandles * @compile TestFieldLookupAccessibility.java * pkg/A.java pkg/B_extends_A.java pkg/C.java @@ -96,6 +96,12 @@ Object lookup(MethodHandles.Lookup l, Field f) throws Exception { return l.unreflectGetter(cloneAndSetAccessible(f)); } + + // Setting the accessibility bit of a Field grants access under + // all conditions for MethodHandle getters. + Set inaccessibleFields(Set inaccessibleFields) { + return new HashSet<>(); + } }, MH_UNREFLECT_SETTER() { Object lookup(MethodHandles.Lookup l, Field f) throws Exception { @@ -103,13 +109,27 @@ } boolean isAccessible(Field f) { - return f.isAccessible() || !Modifier.isFinal(f.getModifiers()); + return f.isAccessible() && !Modifier.isStatic(f.getModifiers()) || !Modifier.isFinal(f.getModifiers()); } }, MH_UNREFLECT_SETTER_ACCESSIBLE() { Object lookup(MethodHandles.Lookup l, Field f) throws Exception { return l.unreflectSetter(cloneAndSetAccessible(f)); } + + boolean isAccessible(Field f) { + return !(Modifier.isStatic(f.getModifiers()) && Modifier.isFinal(f.getModifiers())); + } + + // Setting the accessibility bit of a Field grants access to non-static + // final fields for MethodHandle setters. + Set inaccessibleFields(SetinaccessibleFields) { + Set result = new HashSet<>(); + inaccessibleFields.stream() + .filter(f -> (f.contains("static") && f.contains("final"))) + .forEach(result::add); + return result; + } }, VH() { Object lookup(MethodHandles.Lookup l, Field f) throws Exception { @@ -142,6 +162,10 @@ return true; } + Set inaccessibleFields(Set inaccessibleFields) { + return new HashSet<>(inaccessibleFields); + } + static Field cloneAndSetAccessible(Field f) throws Exception { // Clone to avoid mutating source field f = f.getDeclaringClass().getDeclaredField(f.getName()); @@ -180,7 +204,7 @@ @Test(dataProvider = "lookupProvider") public void test(FieldLookup fl, Class src, MethodHandles.Lookup l, Set inaccessibleFields) { // Add to the expected failures all inaccessible fields due to accessibility modifiers - Set expected = new HashSet<>(inaccessibleFields); + Set expected = fl.inaccessibleFields(inaccessibleFields); Map actual = new HashMap<>(); for (Field f : fields(src)) { @@ -203,11 +227,8 @@ if (!actualFieldNames.equals(expected)) { if (actualFieldNames.isEmpty()) { // Setting the accessibility bit of a Field grants access under - // all conditions for MethodHander getters and setters - if (fl != FieldLookup.MH_UNREFLECT_GETTER_ACCESSIBLE && - fl != FieldLookup.MH_UNREFLECT_SETTER_ACCESSIBLE) { - Assert.assertEquals(actualFieldNames, expected, "No accessibility failures:"); - } + // all conditions for MethodHandle getters + Assert.assertEquals(actualFieldNames, expected, "No accessibility failures:"); } else { Assert.assertEquals(actualFieldNames, expected, "Accessibility failures differ:");