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

Joe Darcy joe.darcy at oracle.com
Thu Mar 28 16:18:59 UTC 2013


Hi Jeroen and Joel,

Static methods on interfaces and *not* default methods and that 
distinction is made my the changeset Joel references. The changeset is 
not in the master repository yet, but should be there soon.

Thanks,

-Joe

On 03/28/2013 03:55 AM, Joel Borggrén-Franck wrote:
> 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