Hi Joe,

I see two problems with the implementation in *AnnotatedElementSupport*. The first is the treatment of declared-only annotations where the code returns either directly present or in-directly present repeatable annotations, but not both. So in the following example:

@Ann(1)
@AnnCont({@Ann(2), @Ann(3)})

it will only return [@Ann(1)], but I think it should return all of them [@Ann(1), @Ann(2), @Ann(3)] - does the spec. define that?

The other is the treatment of "associated" annotations, where the *AnnotatedElementSupport* implementation has similar problem as the Andreas' 1st attempt of at fixing 8004912 for j.l.Class. It turns out that inherited repeating annotations can not be implemented in terms of Class.getAnnotation(Class), since this method aggregates together inherited and declared annotations not taking account of "equivalence" of two possible representations of repeating annotations (with or without the container) thus loosing the information about where in the hierarchy repeating annotations of a particular type are declared. See the following discussion:

http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-October/022190.html

Otherwise I think that implementing AnnotatedElement.get[Declared]AnnotationsByType(Class) consistently at the very root of hierarchy is a good idea. If I'm not mistaken, only j.l.Class defines the difference between getDeclaredAnnotationsByType and getAnnotationsByType - all other AnnotatedElements don't implement inheritance and those two methods are equivalent for them. What about implementing only the "declared" aspect as equivalent default methods in AnnotatedElements, and overriding getAnnotationsByType in j.l.Class ?


Regards, Peter

On 10/24/2013 09:31 AM, Joe Darcy wrote:
Hello,

Please review my initial implementation changes for

JDK-8005294 : Consider default methods for additions to AnnotatedElement
    http://cr.openjdk.java.net/~darcy/8005294.0/

(Specification aspects of the review are taking place over at
http://mail.openjdk.java.net/pipermail/enhanced-metadata-spec-discuss/2013-October/000279.html )

The webrev above is lacking tests. The basic testing approach I plan to take is:

* Declare an AnnotedElementDelegate type in the test file
* An AnnotedElementDelegate wraps an existing AnnotatedElement object, such as a java.lang.Class object or a java.lang.reflect.Method object. Abstract methods of the AnnotatedElement interface are sent to the base object; methods with defaults are run as defaults. * For annotation types including {null, PresentAnnotation, MissingAnnotation, RepeatableAnnotation, ...} the behavior of AnnotedElementDelegate.foo(arg) is compared for equality to baseAnnotatedElement.foo(arg). * Base annotated elements will include a Class object (where annotation inheritance can some input play) and a non-Class object.

Thanks,

-Joe


Reply via email to