8033745: Reflect upon Nashorn reflection

Fri, 21 Feb 2014 17:58:33 +0530

author
sundar
date
Fri, 21 Feb 2014 17:58:33 +0530
changeset 810
f06e404d3a67
parent 809
0c64e5f55d23
child 811
58214b2432e7

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      }

mercurial