RFR: 8029019: (ann) Optimize annotation handling in core reflection

Christoph Dreis christoph.dreis at freenet.de
Fri Feb 10 10:22:09 UTC 2017


Hi Claes,

> 
> I think this all seems reasonable, but subtle behavior changes like this
> needs more scrutiny than I can provide.  I've discussed this offline
> with Joe and sadly concluded it's probably too much, too late for 9 at
> this point.
> 
> Hope you don't mind re-targetting this to JDK 10.

Do you mean the error handling change or the ticket in general? In case of the latter, may I start a proposal?

As the original issue for me was to reduce the allocations coming from AnnotationInvocationHandler.invoke() caused by Method.getParameterTypes(), what about creating a sub-ticket of 8029019 and just take care of the low-risk change below? That would eventually allow a backbort to JDK 8 as well, although I'm not quite sure yet how the backport process is working.

What do you think?

Cheers,
Christoph

========= PATCH ===========
diff --git a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
--- a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
+++ b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
@@ -57,13 +57,13 @@

     public Object invoke(Object proxy, Method method, Object[] args) {
         String member = method.getName();
-        Class<?>[] paramTypes = method.getParameterTypes();
+        int parameterCount = method.getParameterCount();

         // Handle Object and Annotation methods
-        if (member.equals("equals") && paramTypes.length == 1 &&
-            paramTypes[0] == Object.class)
+        if (parameterCount == 1 && member.equals("equals") &&
+            method.getParameterTypes()[0] == Object.class)
             return equalsImpl(proxy, args[0]);
-        if (paramTypes.length != 0)
+        if (parameterCount != 0)
             throw new AssertionError("Too many parameters for an annotation method");

         switch(member) {



More information about the core-libs-dev mailing list