diff --git a/src/share/classes/java/beans/EventHandler.java b/src/share/classes/java/beans/EventHandler.java index b428f2892a142ff54dce520c29379d20bc1f5ff7..935f7359e265ca0471cf789e7e5cdcd131540f0c 100644 --- a/src/share/classes/java/beans/EventHandler.java +++ b/src/share/classes/java/beans/EventHandler.java @@ -33,6 +33,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import sun.reflect.misc.MethodUtil; +import sun.reflect.misc.ReflectUtil; /** * The EventHandler class provides @@ -677,22 +678,38 @@ public class EventHandler implements InvocationHandler { * * @see EventHandler */ - @SuppressWarnings("unchecked") public static T create(Class listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName) { // Create this first to verify target/action are non-null - EventHandler eventHandler = new EventHandler(target, action, + final EventHandler handler = new EventHandler(target, action, eventPropertyName, listenerMethodName); if (listenerInterface == null) { throw new NullPointerException( "listenerInterface must be non-null"); } - return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), - new Class[] {listenerInterface}, - eventHandler); + final ClassLoader loader = getClassLoader(listenerInterface); + final Class[] interfaces = {listenerInterface}; + return AccessController.doPrivileged(new PrivilegedAction() { + @SuppressWarnings("unchecked") + public T run() { + return (T) Proxy.newProxyInstance(loader, interfaces, handler); + } + }); + } + + private static ClassLoader getClassLoader(Class type) { + ReflectUtil.checkPackageAccess(type); + ClassLoader loader = type.getClassLoader(); + if (loader == null) { + loader = Thread.currentThread().getContextClassLoader(); // avoid use of BCP + if (loader == null) { + loader = ClassLoader.getSystemClassLoader(); + } + } + return loader; } }