--- old/src/java.base/share/classes/jdk/internal/reflect/Reflection.java 2019-03-27 16:04:04.000000000 -0700 +++ new/src/java.base/share/classes/jdk/internal/reflect/Reflection.java 2019-03-27 16:04:04.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -122,6 +122,9 @@ Class targetClass, int modifiers) { + Objects.requireNonNull(currentClass); + Objects.requireNonNull(memberClass); + if (currentClass == memberClass) { // Always succeeds return true; @@ -327,6 +330,9 @@ int modifiers) throws IllegalAccessException { + if (currentClass == null) + return newIllegalAccessException(memberClass, modifiers); + String currentSuffix = ""; String memberSuffix = ""; Module m1 = currentClass.getModule(); @@ -356,6 +362,37 @@ } /** + * Returns an IllegalAccessException with an exception message where + * there is no caller frame. + */ + public static IllegalAccessException newIllegalAccessException(Class memberClass, + int modifiers) + throws IllegalAccessException + { + String memberSuffix = ""; + Module m2 = memberClass.getModule(); + if (m2.isNamed()) + memberSuffix = " (in " + m2 + ")"; + + String memberPackageName = memberClass.getPackageName(); + + String msg = "JNI attached native thread (null caller frame) cannot access "; + if (m2.isExported(memberPackageName)) { + + // module access okay so include the modifiers in the message + msg += "a member of " + memberClass + memberSuffix + + " with modifiers \"" + Modifier.toString(modifiers) + "\""; + + } else { + // module access failed + msg += memberClass + memberSuffix+ " because " + + m2 + " does not export " + memberPackageName; + } + + return new IllegalAccessException(msg); + } + + /** * Returns true if {@code currentClass} and {@code memberClass} * are nestmates - that is, if they have the same nesthost as * determined by the VM.