Hi Liam,

On 2/24/2018 5:14 PM, Liam Miller-Cushon wrote:
Hi, thanks for the comments.

The updated webrev is at: http://cr.openjdk.java.net/~cushon/7183985/webrev.02/ <http://cr.openjdk.java.net/%7Ecushon/7183985/webrev.02/>

On Fri, Feb 23, 2018 at 4:29 PM, Joseph D. Darcy <joe.da...@oracle.com <mailto:joe.da...@oracle.com>> wrote:

    Objects implementing the AnnotatedElement interface are also
    created in javac during annotation processing. As a secondary
    concern, it would be good to be have behavior between both javac
    and runtime annotations consistent when possible. (My own to-do
    list includes at least once such alignment JDK-8164819: "Make
    javac's toString() on annotation objects consistent with core
    reflection".)


Do you have a pointer to where that happens? There's javax.lang.model.AnnotatedConstruct#getAnnotation, which isn't affected by this issue--it throws MirroredTypesExceptionProxy when accessing an annotation value that is an array of class literals, regardless of whether the elements' classes are missing. I'm not seeing implementations of AnnotatedElement in langtools.

Sorry, I misremembered the situation in javac. For annotation processing in javac, AnnotatedElement is not a factor, but the class

src/jdk.compiler/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java

in javac does create annotation proxies, which is the same general technique used to create the annotation objects at runtime for core reflection. These annotation objects in javac for javax.lang.model and annotation processing, do not follow the full contract of java.lang.reflect.AnnotatedElement. In particular, the annotations returned are not necessarily serializable. The intersection of methods on AnnotatedConstruct and AnnotatedElement is only a proper subset of the methods on AnnotatedElement; however, getAnnotation​(Class<T> annotationClass) is in the intersection.

    Even in javac we've moved away from test and directory names based
    on bugid. I'd recommend incorporating these regression tests into
    the existing tests in
        test/jdk/java/lang/annotation/Missing


Thanks for the reminder, done.


I believe the new tests could reuse some of the existing types in test/jdk/java/lang/annotation/Missing. For example, the new MissingAnnotation.java is an alpha-rename of the existing Missing.java. If such sharing is not practical, then I'd recommend putting the new files into a subdirectory under underneath test/.../annotation/Missing (otherwise it will be confusing to edit these tests in the future since too many file names will start with "Missing".)

In MissingClassArrayElementTest.java:

  71     public static void main(String[] args) throws Exception {
72 ClassArrayAnnotation[] outer = Test.class.getAnnotation(AnnotationAnnotation.class).value(); 73 // The second entry in the values array can be loaded successfully 74 assertEquals(Arrays.toString(outer[1].value()), "[class java.lang.String]");

Something like

    assertEquals(Arrays.equals(outer[1].value(), {String.class})

would be more robust against any future changes in Class.toString. Likewise for the analogous comparisons.

    It would be worth verifying whether or not this change also covers
    java.lang.reflect.Executable.getParameterAnnotations(), more
    specifically the implementation of that method in Method and
    Constructor. The method getParameterAnnotations() is much less
    used than getAnnotations and the other methods on the
    AnnotatedElement interface, but still part of the annotations feature.


Done.

Thanks.

Cheers,

-Joe

Reply via email to