changeset 7336:4b3d9fc2558c

8035788: Provide more consistency for lookups Reviewed-by: jrose, vlivanov, ahgross
author twisti
date Wed, 19 Mar 2014 10:48:43 -0700
parents 26994c39fd70
children 2c6544759f71
files src/share/classes/java/lang/invoke/MethodHandles.java
diffstat 1 files changed, 7 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/MethodHandles.java	Thu Mar 13 14:58:55 2014 +0400
+++ b/src/share/classes/java/lang/invoke/MethodHandles.java	Wed Mar 19 10:48:43 2014 -0700
@@ -26,12 +26,15 @@
 package java.lang.invoke;
 
 import java.lang.reflect.*;
+
 import sun.invoke.util.ValueConversions;
 import sun.invoke.util.VerifyAccess;
 import sun.invoke.util.Wrapper;
+
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Arrays;
+
 import sun.reflect.CallerSensitive;
 import sun.reflect.Reflection;
 import sun.reflect.misc.ReflectUtil;
@@ -1155,6 +1158,10 @@
             int allowedModes = this.allowedModes;
             if (allowedModes == TRUSTED)  return;
             int mods = m.getModifiers();
+            if (Modifier.isProtected(mods) && refKind == REF_newInvokeSpecial) {
+                // cannot "new" a protected ctor in a different package
+                mods ^= Modifier.PROTECTED;
+            }
             if (Modifier.isFinal(mods) &&
                     MethodHandleNatives.refKindIsSetter(refKind))
                 throw m.makeAccessException("unexpected set of a final field", this);