On 10/13/2017 08:55 AM, Christoph Dreis wrote:
Hi Peter,

Thanks for your feedback!

Method.getName() returns an interned String and String literals are interned 
strings. Reference comparison is therefore possible
Good point.

The pair (declaringClass, methodName) uniquely identifies the method for a 
bunch of interesting methods when declaringClass is either java.lang.Object or 
java.lang.annotation.Annotation, so we don't need to obtain method's 
parameterTypes even for equals().
Forgive me the maybe stupid question, but isn't your proposed code changing semantics because it 
doesn't check for the first parameter in equals() to be of type java.lang.Object anymore? E.g. like 
"method.getParameterTypes()[0] == Object.class". Am I missing something? Personally, I 
find this a bit too "magic" overall. I don't know what Claes thinks about that.

There's only one method named "equals" declared in either Object or Annotation (currently :-). So it's enough to check for declaringClass and name to identify the correct method.

Regards, Peter


I would settle on this, if I include the reference comparison change of yours.

For example:

    public Object invoke(Object proxy, Method method, Object[] args) {
         String memberName = method.getName(); // guaranteed interned String
         int parameterCount = method.getParameterCount();

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

         if (memberName == "hashCode") return hashCodeImpl();
         if (memberName == "annotationType") return type;
         if (memberName == "toString") return toStringImpl();

         // Handle annotation member accessors
         Object result = memberValues.get(memberName);

         if (result == null)
             throw new IncompleteAnnotationException(type, memberName);

         if (result instanceof ExceptionProxy)
             throw ((ExceptionProxy) result).generateException();

         if (result.getClass().isArray() && Array.getLength(result) != 0)
             result = cloneArray(result);

         return result;
     }

What do you think?

Cheers,
Christoph


Reply via email to