--- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java Thu Mar 16 16:34:36 2017 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java Wed Mar 22 16:26:27 2017 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -359,10 +359,11 @@
* @throws NullPointerException if the {@code interfaces} array
* argument or any of its elements are {@code null}
*
- * @deprecated Proxy classes generated in a named module are encapsulated and not
- * accessible to code outside its module.
- * {@link Constructor#newInstance(Object...) Constructor.newInstance} will throw
- * {@code IllegalAccessException} when it is called on an inaccessible proxy class.
+ * @deprecated Proxy classes generated in a named module are encapsulated
+ * and not accessible to code outside its module.
+ * {@link Constructor#newInstance(Object...) Constructor.newInstance}
+ * will throw {@code IllegalAccessException} when it is called on
+ * an inaccessible proxy class.
* Use {@link #newProxyInstance(ClassLoader, Class[], InvocationHandler)}
* to create a proxy instance instead.
*
@@ -511,17 +512,19 @@
"Unnamed package cannot be added to " + m);
}
- // add the package to the runtime module if not exists
if (m.isNamed()) {
- m.addPackage(proxyPkg);
+ if (!m.getDescriptor().packages().contains(proxyPkg)) {
+ throw new InternalError(proxyPkg + " not exist in " + m.getName());
+ }
}
/*
* Choose a name for the proxy class to generate.
*/
long num = nextUniqueNumber.getAndIncrement();
- String proxyName = proxyPkg.isEmpty() ? proxyClassNamePrefix + num
- : proxyPkg + "." + proxyClassNamePrefix + num;
+ String proxyName = proxyPkg.isEmpty()
+ ? proxyClassNamePrefix + num
+ : proxyPkg + "." + proxyClassNamePrefix + num;
ClassLoader loader = getLoader(m);
trace(proxyName, m, loader, interfaces);
@@ -581,9 +584,13 @@
c.getModule().getName(), c.getName(), access, ld);
}
- static void trace(String cn, Module module, ClassLoader loader, List<Class<?>> interfaces) {
+ static void trace(String cn,
+ Module module,
+ ClassLoader loader,
+ List<Class<?>> interfaces) {
if (isDebug()) {
- System.out.format("PROXY: %s/%s defined by %s%n", module.getName(), cn, loader);
+ System.err.format("PROXY: %s/%s defined by %s%n",
+ module.getName(), cn, loader);
}
if (isDebug("debug")) {
interfaces.stream()
@@ -592,7 +599,7 @@
}
private static final String DEBUG =
- GetPropertyAction.privilegedGetProperty("jdk.proxy.debug", "");
+ GetPropertyAction.privilegedGetProperty("jdk.proxy.debug", "");
private static boolean isDebug() {
return !DEBUG.isEmpty();
@@ -603,15 +610,16 @@
// ProxyBuilder instance members start here....
- private final ClassLoader loader;
private final List<Class<?>> interfaces;
private final Module module;
ProxyBuilder(ClassLoader loader, List<Class<?>> interfaces) {
if (!VM.isModuleSystemInited()) {
- throw new InternalError("Proxy is not supported until module system is fully initialized");
+ throw new InternalError("Proxy is not supported until "
+ + "module system is fully initialized");
}
if (interfaces.size() > 65535) {
- throw new IllegalArgumentException("interface limit exceeded: " + interfaces.size());
+ throw new IllegalArgumentException("interface limit exceeded: "
+ + interfaces.size());
}
Set<Class<?>> refTypes = referencedTypes(loader, interfaces);
@@ -619,7 +627,6 @@
// IAE if violates any restrictions specified in newProxyInstance
validateProxyInterfaces(loader, interfaces, refTypes);
- this.loader = loader;
this.interfaces = interfaces;
this.module = mapToModule(loader, interfaces, refTypes);
assert getLoader(module) == loader;
@@ -659,8 +666,8 @@
* Validate the given proxy interfaces and the given referenced types
* are visible to the defining loader.
*
- * @throws IllegalArgumentException if it violates the restrictions specified
- * in {@link Proxy#newProxyInstance}
+ * @throws IllegalArgumentException if it violates the restrictions
+ * specified in {@link Proxy#newProxyInstance}
*/
private static void validateProxyInterfaces(ClassLoader loader,
List<Class<?>> interfaces,
@@ -731,9 +738,9 @@
* is in the same module of the package-private interface.
*
* If all proxy interfaces are public and at least one in a non-exported
- * package, then the proxy class is in a dynamic module in a non-exported
- * package. Reads edge and qualified exports are added for
- * dynamic module to access.
+ * package, then the proxy class is in a dynamic module in a
+ * non-exported package. Reads edge and qualified exports are added
+ * for dynamic module to access.
*/
private static Module mapToModule(ClassLoader loader,
List<Class<?>> interfaces,
@@ -752,11 +759,12 @@
}
}
- // all proxy interfaces are public and exported, the proxy class is in unnamed module
- // Such proxy class is accessible to any unnamed module and named module that
- // can read unnamed module
+ // all proxy interfaces are public and exported, the proxy class
+ // is in unnamed module. Such proxy class is accessible to
+ // any unnamed module and named module that can read unnamed module
if (packagePrivateTypes.isEmpty() && modulePrivateTypes.isEmpty()) {
- return loader != null ? loader.getUnnamedModule() : BootLoader.getUnnamedModule();
+ return loader != null ? loader.getUnnamedModule()
+ : BootLoader.getUnnamedModule();
}
if (packagePrivateTypes.size() > 0) {
@@ -778,7 +786,8 @@
Module target = null;
for (Module m : packagePrivateTypes.values()) {
if (getLoader(m) != loader) {
- // the specified loader is not the same class loader of the non-public interface
+ // the specified loader is not the same class loader
+ // of the non-public interface
throw new IllegalArgumentException(
"non-public interface is not defined by the given loader");
}
@@ -799,8 +808,9 @@
return target;
}
- // all proxy interfaces are public and at least one in a non-exported package
- // map to dynamic proxy module and add reads edge and qualified exports, if necessary
+ // All proxy interfaces are public and at least one in a non-exported
+ // package. So maps to a dynamic proxy module and add reads edge
+ // and qualified exports, if necessary
Module target = getDynamicModule(loader);
// set up proxy class access to proxy interfaces and types
@@ -856,8 +866,8 @@
private static final AtomicInteger counter = new AtomicInteger();
/*
- * Define a dynamic module for the generated proxy classes in a non-exported package
- * named com.sun.proxy.$MODULE.
+ * Define a dynamic module for the generated proxy classes in
+ * a non-exported package named com.sun.proxy.$MODULE.
*
* Each class loader will have one dynamic module.
*/