Fri, 21 Feb 2014 17:58:33 +0530
8033745: Reflect upon Nashorn reflection
Reviewed-by: ahgross, attila, jlaskey
src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java | file | annotate | diff | comparison | revisions |
1.1 --- a/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java Thu Feb 20 20:06:01 2014 +0100 1.2 +++ b/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java Fri Feb 21 17:58:33 2014 +0530 1.3 @@ -39,16 +39,38 @@ 1.4 * Check java reflection permission for java reflective and java.lang.invoke access from scripts 1.5 */ 1.6 final class ReflectionCheckLinker implements TypeBasedGuardingDynamicLinker{ 1.7 + private static final Class<?> STATEMENT_CLASS = getBeanClass("Statement"); 1.8 + private static final Class<?> XMLENCODER_CLASS = getBeanClass("XMLEncoder"); 1.9 + private static final Class<?> XMLDECODER_CLASS = getBeanClass("XMLDecoder"); 1.10 + 1.11 + private static Class<?> getBeanClass(final String name) { 1.12 + try { 1.13 + return Class.forName("java.beans." + name); 1.14 + } catch (final ClassNotFoundException cnfe) { 1.15 + // Possible to miss this class in other profiles. 1.16 + return null; 1.17 + } 1.18 + } 1.19 + 1.20 @Override 1.21 public boolean canLinkType(final Class<?> type) { 1.22 return isReflectionClass(type); 1.23 } 1.24 1.25 private static boolean isReflectionClass(final Class<?> type) { 1.26 + // Class or ClassLoader subclasses 1.27 if (type == Class.class || ClassLoader.class.isAssignableFrom(type)) { 1.28 return true; 1.29 } 1.30 1.31 + // check for bean reflection 1.32 + if ((STATEMENT_CLASS != null && STATEMENT_CLASS.isAssignableFrom(type)) || 1.33 + (XMLENCODER_CLASS != null && XMLENCODER_CLASS.isAssignableFrom(type)) || 1.34 + (XMLDECODER_CLASS != null && XMLDECODER_CLASS.isAssignableFrom(type))) { 1.35 + return true; 1.36 + } 1.37 + 1.38 + // package name check 1.39 final String name = type.getName(); 1.40 return name.startsWith("java.lang.reflect.") || name.startsWith("java.lang.invoke."); 1.41 }