8012716: java.beans.EventHandler.create method should check if the given listenerInterface is a public interface

Reviewed-by: art, mchung
This commit is contained in:
Sergey Malenkov 2013-09-27 22:17:24 +04:00
parent 247ec6ca80
commit dd224c8deb

View File

@ -33,6 +33,7 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.reflect.misc.MethodUtil;
import sun.reflect.misc.ReflectUtil;
/**
* The <code>EventHandler</code> class provides
@ -677,22 +678,38 @@ public class EventHandler implements InvocationHandler {
*
* @see EventHandler
*/
@SuppressWarnings("unchecked")
public static <T> T create(Class<T> 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<T>() {
@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;
}
}