JDK 8 code review request for 8014836: Have GenericDeclaration extend AnnotatedElement

Joseph Darcy joe.darcy at oracle.com
Tue May 21 01:16:00 UTC 2013


Hi Remi,

On 5/20/2013 2:28 PM, Remi Forax wrote:
> On 05/20/2013 11:10 PM, Joe Darcy wrote:
>> Hello,
>>
>> Please review the patch below which implements
>>
>>     8014836: Have GenericDeclaration extend AnnotatedElement
>>
>> All the existing implementations of GenericDeclaration in the JDK 
>> already implement AnnotatedElement. Some code in java.lang.Class 
>> needed to be adjusted slightly since AnnotatedElement declares a 
>> default method and calling an interface's default method in an 
>> implementing class has to go through the direct interface type.
>
> GenericDeclaration is a public interface, so you will break the code 
> of everyone that implements it.
> By example, Guava's Invokable also implements GenericDeclaration
> http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/reflect/Invokable.html 
>

That is technically true; in effect adding several methods to 
GenericDeclaration would break implementations outside of the JDK that 
do not already implement annotated element.

However, this is (only) a source incompatible change and not a binary 
incompatible change so is possible in-bounds for a platform release like 
JDK 8:

http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html#general_evolution_policy

The Invokable type you reference is the moral equivalent of the 
"Executable" superclass of Constructor and Method added earlier in JDK 
8. The Invokable type itself is marked as "@Beta" to warn users that it 
could change or even to away. Therefore, I'm not very concerned about 
"breaking" a type like this, which could easily be retrofitted to also 
implement AnnotatedElement as it already a wrapper around a Method or a 
Constructor.

(Also interesting to see a "Parameter" class in Guava given that we have 
added a Parameter class to java.lang.reflect.)

Thanks,

-Joe

>
>>
>> Thanks,
>>
>> -Joe
>
> Rémi
>
>>
>> --- a/src/share/classes/java/lang/Class.java    Mon May 20 11:56:46 
>> 2013 -0700
>> +++ b/src/share/classes/java/lang/Class.java    Mon May 20 14:07:15 
>> 2013 -0700
>> @@ -28,6 +28,7 @@
>>  import java.lang.reflect.AnnotatedElement;
>>  import java.lang.reflect.Array;
>>  import java.lang.reflect.GenericArrayType;
>> +import java.lang.reflect.GenericDeclaration;
>>  import java.lang.reflect.Member;
>>  import java.lang.reflect.Field;
>>  import java.lang.reflect.Executable;
>> @@ -115,9 +116,9 @@
>>   * @since   JDK1.0
>>   */
>>  public final class Class<T> implements java.io.Serializable,
>> - java.lang.reflect.GenericDeclaration,
>> -                              java.lang.reflect.Type,
>> - java.lang.reflect.AnnotatedElement {
>> +                              GenericDeclaration,
>> +                              Type,
>> +                              AnnotatedElement {
>>      private static final int ANNOTATION= 0x00002000;
>>      private static final int ENUM      = 0x00004000;
>>      private static final int SYNTHETIC = 0x00001000;
>> @@ -3182,7 +3183,7 @@
>>       */
>>      @Override
>>      public boolean isAnnotationPresent(Class<? extends Annotation> 
>> annotationClass) {
>> -        return 
>> AnnotatedElement.super.isAnnotationPresent(annotationClass);
>> +        return 
>> GenericDeclaration.super.isAnnotationPresent(annotationClass);
>>      }
>>
>>      /**
>> diff -r 6a9148865139 
>> src/share/classes/java/lang/reflect/GenericDeclaration.java
>> --- a/src/share/classes/java/lang/reflect/GenericDeclaration.java Mon 
>> May 20 11:56:46 2013 -0700
>> +++ b/src/share/classes/java/lang/reflect/GenericDeclaration.java Mon 
>> May 20 14:07:15 2013 -0700
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All 
>> rights reserved.
>> + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All 
>> rights reserved.
>>   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>   *
>>   * This code is free software; you can redistribute it and/or modify it
>> @@ -30,7 +30,7 @@
>>   *
>>   * @since 1.5
>>   */
>> -public interface GenericDeclaration {
>> +public interface GenericDeclaration extends AnnotatedElement {
>>      /**
>>       * Returns an array of {@code TypeVariable} objects that
>>       * represent the type variables declared by the generic
>>
>




More information about the core-libs-dev mailing list