提交 45af944f 编写于 作者: M mchung

4487672: (proxy) Proxy constructor should check for null argument

Reviewed-by: alanb, lancea
上级 adbcdc0d
......@@ -31,6 +31,7 @@ import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiFunction;
import sun.misc.ProxyGenerator;
......@@ -255,9 +256,13 @@ public class Proxy implements java.io.Serializable {
* (typically, a dynamic proxy class) with the specified value
* for its invocation handler.
*
* @param h the invocation handler for this proxy instance
* @param h the invocation handler for this proxy instance
*
* @throws NullPointerException if the given invocation handler, {@code h},
* is {@code null}.
*/
protected Proxy(InvocationHandler h) {
Objects.requireNonNull(h);
this.h = h;
}
......@@ -698,9 +703,7 @@ public class Proxy implements java.io.Serializable {
InvocationHandler h)
throws IllegalArgumentException
{
if (h == null) {
throw new NullPointerException();
}
Objects.requireNonNull(h);
final SecurityManager sm = System.getSecurityManager();
if (sm != null) {
......
......@@ -22,7 +22,7 @@
*/
/* @test
* @bug 4227192
* @bug 4227192 4487672
* @summary This is a basic functional test of the dynamic proxy API (part 1).
* @author Peter Jones
*
......@@ -42,15 +42,15 @@ public class Basic1 {
"\nBasic functional test of dynamic proxy API, part 1\n");
try {
Class[] interfaces =
new Class[] { Runnable.class, Observer.class };
Class<?>[] interfaces =
new Class<?>[] { Runnable.class, Observer.class };
ClassLoader loader = ClassLoader.getSystemClassLoader();
/*
* Generate a proxy class.
*/
Class proxyClass = Proxy.getProxyClass(loader, interfaces);
Class<?> proxyClass = Proxy.getProxyClass(loader, interfaces);
System.err.println("+ generated proxy class: " + proxyClass);
/*
......@@ -72,19 +72,19 @@ public class Basic1 {
/*
* Verify that it is assignable to the proxy interfaces.
*/
for (int i = 0; i < interfaces.length; i++) {
if (!interfaces[i].isAssignableFrom(proxyClass)) {
for (Class<?> intf : interfaces) {
if (!intf.isAssignableFrom(proxyClass)) {
throw new RuntimeException(
"proxy class not assignable to proxy interface " +
interfaces[i].getName());
intf.getName());
}
}
/*
* Verify that it has the given permutation of interfaces.
*/
List l1 = Arrays.asList(interfaces);
List l2 = Arrays.asList(proxyClass.getInterfaces());
List<Class<?>> l1 = Arrays.asList(interfaces);
List<Class<?>> l2 = Arrays.asList(proxyClass.getInterfaces());
System.err.println("+ proxy class's interfaces: " + l2);
if (!l1.equals(l2)) {
throw new RuntimeException(
......@@ -118,14 +118,26 @@ public class Basic1 {
* Verify that it has a constructor that takes an
* InvocationHandler instance.
*/
Constructor cons = proxyClass.getConstructor(
new Class[] { InvocationHandler.class });
Constructor<?> cons = proxyClass.getConstructor(InvocationHandler.class);
/*
* Test constructor with null InvocationHandler
*/
try {
cons.newInstance(new Object[] { null });
throw new RuntimeException("Expected NullPointerException thrown");
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (!(t instanceof NullPointerException)) {
throw t;
}
}
/*
* Construct a proxy instance.
*/
Handler handler = new Handler();
Object proxy = cons.newInstance(new Object[] { handler });
Object proxy = cons.newInstance(handler);
handler.currentProxy = proxy;
/*
......@@ -141,7 +153,7 @@ public class Basic1 {
System.err.println("\nTEST PASSED");
} catch (Exception e) {
} catch (Throwable e) {
System.err.println("\nTEST FAILED:");
e.printStackTrace();
throw new RuntimeException("TEST FAILED: " + e.toString());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册