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;
}
}