JDK 8 code review request for JDK-8004979 java.lang.reflect.Modifier.toString should include "default"

Joel Borggrén-Franck joel.franck at oracle.com
Thu Mar 28 10:55:53 UTC 2013


Hi Jeroen,

See http://hg.openjdk.java.net/jdk8/tl/jdk/rev/cf0049037deb

I'm not sure if this is in a promoted build yet.

cheers
/Joel

On 28 mar 2013, at 11:38, Jeroen Frijters <jeroen at sumatra.nl> wrote:

> Hi Joe,
> 
> I notice that Method.isDefault() returns true for static interface methods. I assume that is not correct.
> 
> Regards,
> Jeroen
> 
>> -----Original Message-----
>> From: core-libs-dev-bounces at openjdk.java.net [mailto:core-libs-dev-
>> bounces at openjdk.java.net] On Behalf Of Joe Darcy
>> Sent: Thursday, March 28, 2013 8:03
>> To: Core-Libs-Dev
>> Subject: JDK 8 code review request for JDK-8004979
>> java.lang.reflect.Modifier.toString should include "default"
>> 
>> Hello,
>> 
>> Please review these changes to add support for the "default" modifier to
>> the output of Method.to[Generic]String:
>> 
>>     8004979 java.lang.reflect.Modifier.toString should include
>> "default"
>>     http://cr.openjdk.java.net/~darcy/8004979.0/
>> 
>> Patch also included below.
>> 
>> Thanks,
>> 
>> -Joe
>> 
>> diff -r d254a5f9b93f
>> src/share/classes/java/lang/reflect/Constructor.java
>> --- a/src/share/classes/java/lang/reflect/Constructor.java    Wed Mar 27
>> 13:40:26 2013 -0400
>> +++ b/src/share/classes/java/lang/reflect/Constructor.java    Thu Mar 28
>> 00:02:06 2013 -0700
>> @@ -284,9 +284,13 @@
>>       * modifiers {@code public}, {@code protected} or
>>       * {@code private}.  Only one of these may appear, or none if the
>>       * constructor has default (package) access.
>> +     *
>> +     * @return a string describing this {@code Constructor}
>> +     * @jls 8.8.3. Constructor Modifiers
>>       */
>>      public String toString() {
>>          return sharedToString(Modifier.constructorModifiers(),
>> +                              false,
>>                                parameterTypes,
>>                                exceptionTypes);
>>      }
>> @@ -328,10 +332,11 @@
>>       * include type parameters
>>       *
>>       * @since 1.5
>> +     * @jls 8.8.3. Constructor Modifiers
>>       */
>>      @Override
>>      public String toGenericString() {
>> -        return sharedToGenericString(Modifier.constructorModifiers());
>> +        return sharedToGenericString(Modifier.constructorModifiers(),
>> false);
>>      }
>> 
>>      @Override
>> diff -r d254a5f9b93f src/share/classes/java/lang/reflect/Executable.java
>> --- a/src/share/classes/java/lang/reflect/Executable.java    Wed Mar 27
>> 13:40:26 2013 -0400
>> +++ b/src/share/classes/java/lang/reflect/Executable.java    Thu Mar 28
>> 00:02:06 2013 -0700
>> @@ -89,20 +89,24 @@
>> 
>>      }
>> 
>> -    void printModifiersIfNonzero(StringBuilder sb, int mask) {
>> +    void printModifiersIfNonzero(StringBuilder sb, int mask, boolean
>> isDefault) {
>>          int mod = getModifiers() & mask;
>>          if (mod != 0) {
>>              sb.append(Modifier.toString(mod)).append(' ');
>>          }
>> +        if (isDefault) {
>> +            sb.append("default ");
>> +        }
>>      }
>> 
>>      String sharedToString(int modifierMask,
>> +                          boolean isDefault,
>>                            Class<?>[] parameterTypes,
>>                            Class<?>[] exceptionTypes) {
>>          try {
>>              StringBuilder sb = new StringBuilder();
>> 
>> -            printModifiersIfNonzero(sb, modifierMask);
>> +            printModifiersIfNonzero(sb, modifierMask, isDefault);
>>              specificToStringHeader(sb);
>> 
>>              sb.append('(');
>> @@ -124,11 +128,11 @@
>>       */
>>      abstract void specificToStringHeader(StringBuilder sb);
>> 
>> -    String sharedToGenericString(int modifierMask) {
>> +    String sharedToGenericString(int modifierMask, boolean isDefault) {
>>          try {
>>              StringBuilder sb = new StringBuilder();
>> 
>> -            printModifiersIfNonzero(sb, modifierMask);
>> +            printModifiersIfNonzero(sb, modifierMask, isDefault);
>> 
>>              TypeVariable<?>[] typeparms = getTypeParameters();
>>              if (typeparms.length > 0) { diff -r d254a5f9b93f
>> src/share/classes/java/lang/reflect/Field.java
>> --- a/src/share/classes/java/lang/reflect/Field.java    Wed Mar 27
>> 13:40:26 2013 -0400
>> +++ b/src/share/classes/java/lang/reflect/Field.java    Thu Mar 28
>> 00:02:06 2013 -0700
>> @@ -288,6 +288,9 @@
>>       * {@code protected} or {@code private} first, and then other
>>       * modifiers in the following order: {@code static}, {@code
>> final},
>>       * {@code transient}, {@code volatile}.
>> +     *
>> +     * @return a string describing this {@code Field}
>> +     * @jls 8.3.1 Field Modifiers
>>       */
>>      public String toString() {
>>          int mod = getModifiers();
>> @@ -315,6 +318,7 @@
>>       * its generic type
>>       *
>>       * @since 1.5
>> +     * @jls 8.3.1 Field Modifiers
>>       */
>>      public String toGenericString() {
>>          int mod = getModifiers();
>> diff -r d254a5f9b93f src/share/classes/java/lang/reflect/Method.java
>> --- a/src/share/classes/java/lang/reflect/Method.java    Wed Mar 27
>> 13:40:26 2013 -0400
>> +++ b/src/share/classes/java/lang/reflect/Method.java    Thu Mar 28
>> 00:02:06 2013 -0700
>> @@ -343,10 +343,16 @@
>>       * {@code public}, {@code protected} or {@code private} first,
>>       * and then other modifiers in the following order:
>>       * {@code abstract}, {@code static}, {@code final},
>> -     * {@code synchronized}, {@code native}, {@code strictfp}.
>> +     * {@code synchronized}, {@code native}, {@code strictfp},
>> +     * {@code default}.
>> +     *
>> +     * @return a string describing this {@code Method}
>> +     *
>> +     * @jls 8.4.3 Method Modifiers
>>       */
>>      public String toString() {
>>          return sharedToString(Modifier.methodModifiers(),
>> +                              isDefault(),
>>                                parameterTypes,
>>                                exceptionTypes);
>>      }
>> @@ -389,16 +395,19 @@
>>       * {@code public}, {@code protected} or {@code private} first,
>>       * and then other modifiers in the following order:
>>       * {@code abstract}, {@code static}, {@code final},
>> -     * {@code synchronized}, {@code native}, {@code strictfp}.
>> +     * {@code synchronized}, {@code native}, {@code strictfp},
>> +     * {@code default}.
>>       *
>>       * @return a string describing this {@code Method},
>>       * include type parameters
>>       *
>>       * @since 1.5
>> +     *
>> +     * @jls 8.4.3 Method Modifiers
>>       */
>>      @Override
>>      public String toGenericString() {
>> -        return sharedToGenericString(Modifier.methodModifiers());
>> +        return sharedToGenericString(Modifier.methodModifiers(),
>> isDefault());
>>      }
>> 
>>      @Override
>> diff -r d254a5f9b93f
>> test/java/lang/reflect/Method/GenericStringTest.java
>> --- a/test/java/lang/reflect/Method/GenericStringTest.java    Wed Mar 27
>> 13:40:26 2013 -0400
>> +++ b/test/java/lang/reflect/Method/GenericStringTest.java    Thu Mar 28
>> 00:02:06 2013 -0700
>> @@ -23,7 +23,7 @@
>> 
>>  /*
>>   * @test
>> - * @bug 5033583 6316717 6470106
>> + * @bug 5033583 6316717 6470106 8004979
>>   * @summary Check toGenericString() and toString() methods
>>   * @author Joseph D. Darcy
>>   */
>> @@ -39,6 +39,7 @@
>>          classList.add(TestClass1.class);
>>          classList.add(TestClass2.class);
>>          classList.add(Roebling.class);
>> +        classList.add(TestInterface1.class);
>> 
>> 
>>          for(Class<?> clazz: classList) @@ -129,6 +130,20 @@
>>      void varArg(Object ... arg) {}
>>  }
>> 
>> +interface TestInterface1 {
>> +    @ExpectedGenericString(
>> +   "public default void TestInterface1.foo()")
>> +    @ExpectedString(
>> +   "public default void TestInterface1.foo()")
>> +    public default void foo(){;}
>> +
>> +    @ExpectedString(
>> +   "public default java.lang.Object TestInterface1.bar()")
>> +    @ExpectedGenericString(
>> +   "public default <A> A TestInterface1.bar()")
>> +    default <A> A bar(){return null;}
>> +}
>> +
>>  @Retention(RetentionPolicy.RUNTIME)
>>  @interface ExpectedGenericString {
>>      String value();
> 




More information about the core-libs-dev mailing list