# HG changeset patch # User redestad # Date 1522169934 -7200 # Tue Mar 27 18:58:54 2018 +0200 # Node ID c5bbbc60bf58b7698f4de332b525b417fa5f6130 # Parent ce86061aff12f44076711e33780791c5e718b867 8200289: Reduce number of exceptions created when calling Lookup::canBeCached Reviewed-by: sundar, psandoz diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java --- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -2035,11 +2035,26 @@ ReflectiveOperationException.class); } + MemberName resolveOrNull(byte refKind, MemberName member) { + // do this before attempting to resolve + if (!isClassAccessible(member.getDeclaringClass())) { + return null; + } + Objects.requireNonNull(member.getName()); + Objects.requireNonNull(member.getType()); + return IMPL_NAMES.resolveOrNull(refKind, member, lookupClassOrNull()); + } + void checkSymbolicClass(Class refc) throws IllegalAccessException { + if (!isClassAccessible(refc)) { + throw new MemberName(refc).makeAccessException("symbolic reference class is not accessible", this); + } + } + + boolean isClassAccessible(Class refc) { Objects.requireNonNull(refc); Class caller = lookupClassOrNull(); - if (caller != null && !VerifyAccess.isClassAccessible(refc, caller, allowedModes)) - throw new MemberName(refc).makeAccessException("symbolic reference class is not accessible", this); + return caller == null || VerifyAccess.isClassAccessible(refc, caller, allowedModes); } /** Check name for an illegal leading "<" character. */ @@ -2482,10 +2497,13 @@ } } try { - MemberName resolved2 = publicLookup().resolveOrFail(refKind, + MemberName resolved2 = publicLookup().resolveOrNull(refKind, new MemberName(refKind, defc, member.getName(), member.getType())); + if (resolved2 == null) { + return false; + } checkSecurityManager(defc, resolved2); - } catch (ReflectiveOperationException | SecurityException ex) { + } catch (SecurityException ex) { return false; } return true;