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

Jeroen Frijters jeroen at sumatra.nl
Thu Mar 28 10:38:02 UTC 2013


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