< prev index next >

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

Print this page

        

@@ -47,10 +47,11 @@
 import jdk.internal.misc.VM;
 import jdk.internal.reflect.CallerSensitive;
 import jdk.internal.reflect.Reflection;
 import jdk.internal.loader.ClassLoaderValue;
 import sun.reflect.misc.ReflectUtil;
+import sun.security.action.GetBooleanAction;
 import sun.security.action.GetPropertyAction;
 import sun.security.util.SecurityConstants;
 
 import static java.lang.module.ModuleDescriptor.Modifier.SYNTHETIC;
 

@@ -97,11 +98,11 @@
  * <li>A proxy class is <em>final and non-abstract</em>.
  *
  * <li>A proxy class extends {@code java.lang.reflect.Proxy}.
  *
  * <li>A proxy class implements exactly the interfaces specified at its
- * creation, in the same order. Invoking {@link Class#getInterfaces getInterfaces}
+ * creation, in the same order. Invoking {@link Class#getInterfaces() getInterfaces}
  * on its {@code Class} object will return an array containing the same
  * list of interfaces (in the order specified at its creation), invoking
  * {@link Class#getMethods getMethods} on its {@code Class} object will return
  * an array of {@code Method} objects that include all of the
  * methods in those interfaces, and invoking {@code getMethod} will

@@ -294,10 +295,17 @@
      */
     private static final ClassLoaderValue<Constructor<?>> proxyCache =
         new ClassLoaderValue<>();
 
     /**
+     * System property to revert to generation of proxy class files for version 1.5 (V49).
+     * Set to "true" to generate v49 class file format.
+     */
+    private static final boolean PROXY_GENERATOR_V49 =
+            GetBooleanAction.privilegedGetProperty("jdk.proxy.ProxyGenerator.v49");
+
+    /**
      * the invocation handler for this proxy instance.
      * @serial
      */
     protected InvocationHandler h;
 

@@ -529,12 +537,13 @@
             trace(proxyName, m, loader, interfaces);
 
             /*
              * Generate the specified proxy class.
              */
-            byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
-                    proxyName, interfaces.toArray(EMPTY_CLASS_ARRAY), accessFlags);
+            byte[] proxyClassFile = PROXY_GENERATOR_V49
+                    ? ProxyGenerator_v49.generateProxyClass(proxyName, interfaces, accessFlags)
+                    : ProxyGenerator.generateProxyClass(loader, proxyName, interfaces, accessFlags);
             try {
                 Class<?> pc = JLA.defineClass(loader, proxyName, proxyClassFile,
                                               null, "__dynamic_proxy__");
                 reverseProxyCache.sub(pc).putIfAbsent(loader, Boolean.TRUE);
                 return pc;

@@ -1114,8 +1123,7 @@
         }
 
         return ih;
     }
 
-    private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0];
     private static final String PROXY_PACKAGE_PREFIX = ReflectUtil.PROXY_PACKAGE;
 }
< prev index next >