8007405: Update java.lang.reflect API to replace SYNTHESIZED with MANDATED
Reviewed-by: darcy
--- a/jdk/src/share/classes/java/lang/reflect/Executable.java Mon Feb 11 10:07:01 2013 -0800
+++ b/jdk/src/share/classes/java/lang/reflect/Executable.java Mon Feb 11 20:16:18 2013 +0000
@@ -278,6 +278,10 @@
* this object. Returns an array of length 0 if the executable
* has no parameters.
*
+ * The parameters of the underlying executable do not necessarily
+ * have unique names, or names that are legal identifiers in the
+ * Java programming language (JLS 3.8).
+ *
* @return an array of {@code Parameter} objects representing all
* the parameters to the executable this object represents
*/
--- a/jdk/src/share/classes/java/lang/reflect/Modifier.java Mon Feb 11 10:07:01 2013 -0800
+++ b/jdk/src/share/classes/java/lang/reflect/Modifier.java Mon Feb 11 20:16:18 2013 +0000
@@ -342,13 +342,13 @@
static final int SYNTHETIC = 0x00001000;
static final int ANNOTATION = 0x00002000;
static final int ENUM = 0x00004000;
- static final int SYNTHESIZED = 0x00010000;
+ static final int MANDATED = 0x00008000;
static boolean isSynthetic(int mod) {
return (mod & SYNTHETIC) != 0;
}
- static boolean isSynthesized(int mod) {
- return (mod & SYNTHESIZED) != 0;
+ static boolean isMandated(int mod) {
+ return (mod & MANDATED) != 0;
}
/**
--- a/jdk/src/share/classes/java/lang/reflect/Parameter.java Mon Feb 11 10:07:01 2013 -0800
+++ b/jdk/src/share/classes/java/lang/reflect/Parameter.java Mon Feb 11 20:16:18 2013 +0000
@@ -44,7 +44,7 @@
private final String name;
private final int modifiers;
private final Executable executable;
- private int index;
+ private final int index;
/**
* Package-private constructor for {@code Parameter}.
@@ -95,9 +95,14 @@
}
/**
- * Returns a string representation of the parameter's modifiers,
- * its attributes, its type, its name, and a trailing ... if it is
- * a variadic parameter.
+ * Returns a string describing this parameter. The format is the
+ * modifiers for the parameter, if any, in canonical order as
+ * recommended by <cite>The Java™ Language
+ * Specification</cite>, followed by the fully- qualified type of
+ * the parameter (excluding the last [] if the parameter is
+ * variable arity), followed by "..." if the parameter is variable
+ * arity, followed by a space, followed by the name of the
+ * parameter.
*
* @return A string representation of the parameter and associated
* information.
@@ -118,7 +123,7 @@
sb.append(typename);
sb.append(" ");
- sb.append(name);
+ sb.append(getName());
return sb.toString();
}
@@ -143,11 +148,23 @@
}
/**
- * Returns the name of the parameter represented by this
- * {@code Parameter} object.
+ * Returns the name of the parameter. The names of the parameters
+ * of a single executable must all the be distinct. When names
+ * from the originating source are available, they are returned.
+ * Otherwise, an implementation of this method is free to create a
+ * name of this parameter, subject to the unquiness requirments.
*/
public String getName() {
- return name;
+ // As per the spec, if a parameter has no name, return argX,
+ // where x is the index.
+ //
+ // Note: spec updates now outlaw empty strings as parameter
+ // names. The .equals("") is for compatibility with current
+ // JVM behavior. It may be removed at some point.
+ if(name == null || name.equals(""))
+ return "arg" + index;
+ else
+ return name;
}
/**
@@ -190,20 +207,21 @@
private transient volatile Class<?> parameterClassCache = null;
/**
- * Returns {@code true} if this parameter is a synthesized
- * construct; returns {@code false} otherwise.
+ * Returns {@code true} if this parameter is implicitly declared
+ * in source code; returns {@code false} otherwise.
*
- * @return true if and only if this parameter is a synthesized
- * construct as defined by
- * <cite>The Java™ Language Specification</cite>.
+ * @return true if and only if this parameter is implicitly
+ * declared as defined by <cite>The Java™ Language
+ * Specification</cite>.
*/
- public boolean isSynthesized() {
- return Modifier.isSynthesized(getModifiers());
+ public boolean isImplicit() {
+ return Modifier.isMandated(getModifiers());
}
/**
- * Returns {@code true} if this parameter is a synthetic
- * construct; returns {@code false} otherwise.
+ * Returns {@code true} if this parameter is neither implicitly
+ * nor explicitly declared in source code; returns {@code false}
+ * otherwise.
*
* @jls 13.1 The Form of a Binary
* @return true if and only if this parameter is a synthetic