< prev index next >

src/java.base/share/classes/java/lang/reflect/Proxy.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1999, 2013, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 357,370 **** * s.checkPackageAccess()} denies access to {@code intf}.</li> * </ul> * @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. * Use {@link #newProxyInstance(ClassLoader, Class[], InvocationHandler)} * to create a proxy instance instead. * * @see <a href="#membership">Package and Module Membership of Proxy Class</a> * @revised 9 --- 357,371 ---- * s.checkPackageAccess()} denies access to {@code intf}.</li> * </ul> * @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. * Use {@link #newProxyInstance(ClassLoader, Class[], InvocationHandler)} * to create a proxy instance instead. * * @see <a href="#membership">Package and Module Membership of Proxy Class</a> * @revised 9
*** 509,528 **** } else if (proxyPkg.isEmpty() && m.isNamed()) { throw new IllegalArgumentException( "Unnamed package cannot be added to " + m); } - // add the package to the runtime module if not exists if (m.isNamed()) { ! m.addPackage(proxyPkg); } /* * Choose a name for the proxy class to generate. */ long num = nextUniqueNumber.getAndIncrement(); ! String proxyName = proxyPkg.isEmpty() ? proxyClassNamePrefix + num : proxyPkg + "." + proxyClassNamePrefix + num; ClassLoader loader = getLoader(m); trace(proxyName, m, loader, interfaces); --- 510,531 ---- } else if (proxyPkg.isEmpty() && m.isNamed()) { throw new IllegalArgumentException( "Unnamed package cannot be added to " + m); } if (m.isNamed()) { ! 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; ClassLoader loader = getLoader(m); trace(proxyName, m, loader, interfaces);
*** 579,591 **** ClassLoader ld = c.getClassLoader(); return String.format(" %s/%s %s loader %s", c.getModule().getName(), c.getName(), access, ld); } ! 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); } if (isDebug("debug")) { interfaces.stream() .forEach(c -> System.out.println(toDetails(c))); } --- 582,598 ---- ClassLoader ld = c.getClassLoader(); return String.format(" %s/%s %s loader %s", c.getModule().getName(), c.getName(), access, ld); } ! static void trace(String cn, ! Module module, ! ClassLoader loader, ! List<Class<?>> interfaces) { if (isDebug()) { ! System.err.format("PROXY: %s/%s defined by %s%n", ! module.getName(), cn, loader); } if (isDebug("debug")) { interfaces.stream() .forEach(c -> System.out.println(toDetails(c))); }
*** 601,627 **** return DEBUG.equals(flag); } // 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"); } if (interfaces.size() > 65535) { ! throw new IllegalArgumentException("interface limit exceeded: " + interfaces.size()); } Set<Class<?>> refTypes = referencedTypes(loader, interfaces); // 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; } --- 608,634 ---- return DEBUG.equals(flag); } // ProxyBuilder instance members start here.... 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"); } if (interfaces.size() > 65535) { ! throw new IllegalArgumentException("interface limit exceeded: " ! + interfaces.size()); } Set<Class<?>> refTypes = referencedTypes(loader, interfaces); // IAE if violates any restrictions specified in newProxyInstance validateProxyInterfaces(loader, interfaces, refTypes); this.interfaces = interfaces; this.module = mapToModule(loader, interfaces, refTypes); assert getLoader(module) == loader; }
*** 657,668 **** /** * 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} */ private static void validateProxyInterfaces(ClassLoader loader, List<Class<?>> interfaces, Set<Class<?>> refTypes) { --- 664,675 ---- /** * 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} */ private static void validateProxyInterfaces(ClassLoader loader, List<Class<?>> interfaces, Set<Class<?>> refTypes) {
*** 729,741 **** * * If any of proxy interface is package-private, then the proxy class * 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. */ private static Module mapToModule(ClassLoader loader, List<Class<?>> interfaces, Set<Class<?>> refTypes) { Map<Class<?>, Module> modulePrivateTypes = new HashMap<>(); --- 736,748 ---- * * If any of proxy interface is package-private, then the proxy class * 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. */ private static Module mapToModule(ClassLoader loader, List<Class<?>> interfaces, Set<Class<?>> refTypes) { Map<Class<?>, Module> modulePrivateTypes = new HashMap<>();
*** 750,764 **** } else { packagePrivateTypes.put(intf, m); } } ! // 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(); } if (packagePrivateTypes.size() > 0) { // all package-private types must be in the same runtime package // i.e. same package name and same module (named or unnamed) --- 757,772 ---- } else { packagePrivateTypes.put(intf, m); } } ! // 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(); } if (packagePrivateTypes.size() > 0) { // all package-private types must be in the same runtime package // i.e. same package name and same module (named or unnamed)
*** 776,786 **** // all package-private types are in the same module (named or unnamed) 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 throw new IllegalArgumentException( "non-public interface is not defined by the given loader"); } target = m; } --- 784,795 ---- // all package-private types are in the same module (named or unnamed) 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 throw new IllegalArgumentException( "non-public interface is not defined by the given loader"); } target = m; }
*** 797,808 **** // return the module of the package-private interface 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 Module target = getDynamicModule(loader); // set up proxy class access to proxy interfaces and types // referenced in the method signature Set<Class<?>> types = new HashSet<>(interfaces); --- 806,818 ---- // return the module of the package-private interface return target; } ! // 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 // referenced in the method signature Set<Class<?>> types = new HashSet<>(interfaces);
*** 854,865 **** private static final ClassLoaderValue<Module> dynProxyModules = new ClassLoaderValue<>(); 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. * * Each class loader will have one dynamic module. */ private static Module getDynamicModule(ClassLoader loader) { return dynProxyModules.computeIfAbsent(loader, (ld, clv) -> { --- 864,875 ---- private static final ClassLoaderValue<Module> dynProxyModules = new ClassLoaderValue<>(); 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. * * Each class loader will have one dynamic module. */ private static Module getDynamicModule(ClassLoader loader) { return dynProxyModules.computeIfAbsent(loader, (ld, clv) -> {
< prev index next >