From 1110a73114cbd0462175fffd00cb6ef198d2c98b Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Fri, 21 Feb 2014 10:01:59 +0530 Subject: [PATCH] 8033745: Reflect upon Nashorn reflection Reviewed-by: ahgross, attila, jlaskey --- .../runtime/linker/ReflectionCheckLinker.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java b/nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java index 8fc76c19ed6..66720c238d9 100644 --- a/nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java +++ b/nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java @@ -39,16 +39,38 @@ import jdk.nashorn.internal.runtime.Context; * Check java reflection permission for java reflective and java.lang.invoke access from scripts */ final class ReflectionCheckLinker implements TypeBasedGuardingDynamicLinker{ + private static final Class STATEMENT_CLASS = getBeanClass("Statement"); + private static final Class XMLENCODER_CLASS = getBeanClass("XMLEncoder"); + private static final Class XMLDECODER_CLASS = getBeanClass("XMLDecoder"); + + private static Class getBeanClass(final String name) { + try { + return Class.forName("java.beans." + name); + } catch (final ClassNotFoundException cnfe) { + // Possible to miss this class in other profiles. + return null; + } + } + @Override public boolean canLinkType(final Class type) { return isReflectionClass(type); } private static boolean isReflectionClass(final Class type) { + // Class or ClassLoader subclasses if (type == Class.class || ClassLoader.class.isAssignableFrom(type)) { return true; } + // check for bean reflection + if ((STATEMENT_CLASS != null && STATEMENT_CLASS.isAssignableFrom(type)) || + (XMLENCODER_CLASS != null && XMLENCODER_CLASS.isAssignableFrom(type)) || + (XMLDECODER_CLASS != null && XMLDECODER_CLASS.isAssignableFrom(type))) { + return true; + } + + // package name check final String name = type.getName(); return name.startsWith("java.lang.reflect.") || name.startsWith("java.lang.invoke."); }