aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/java/lang/invoke/MethodHandles.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/classes/java/lang/invoke/MethodHandles.java')
-rw-r--r--src/share/classes/java/lang/invoke/MethodHandles.java6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/share/classes/java/lang/invoke/MethodHandles.java b/src/share/classes/java/lang/invoke/MethodHandles.java
index cdc764dee..09103d534 100644
--- a/src/share/classes/java/lang/invoke/MethodHandles.java
+++ b/src/share/classes/java/lang/invoke/MethodHandles.java
@@ -39,7 +39,9 @@ import sun.reflect.misc.ReflectUtil;
import sun.security.util.SecurityConstants;
import static java.lang.invoke.MethodHandleStatics.*;
import static java.lang.invoke.MethodHandleNatives.Constants.*;
+
import java.util.concurrent.ConcurrentHashMap;
+
import sun.security.util.SecurityConstants;
/**
@@ -1504,6 +1506,10 @@ return mh1;
// that is *not* the bytecode behavior.
mods ^= Modifier.PROTECTED | Modifier.PUBLIC;
}
+ 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);