--- old/src/java.base/share/classes/java/lang/reflect/Proxy.java 2017-03-21 13:44:01.179294903 +0000 +++ new/src/java.base/share/classes/java/lang/reflect/Proxy.java 2017-03-21 13:44:00.979281178 +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> interfaces) { + static void trace(String cn, + Module module, + ClassLoader loader, + List> 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> interfaces; private final Module module; ProxyBuilder(ClassLoader loader, List> 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> 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> 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> 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. */