src/share/classes/java/lang/reflect/Parameter.java
Print this page
@@ -42,11 +42,11 @@
public final class Parameter implements AnnotatedElement {
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}.
*
* If method parameter data is present in the classfile, then the
@@ -93,13 +93,18 @@
public int hashCode() {
return executable.hashCode() ^ index;
}
/**
- * 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.
*/
public String toString() {
@@ -116,11 +121,11 @@
sb.append(typename.replaceFirst("\\[\\]$", "..."));
else
sb.append(typename);
sb.append(" ");
- sb.append(name);
+ sb.append(getName());
return sb.toString();
}
/**
@@ -141,14 +146,26 @@
public int getModifiers() {
return modifiers;
}
/**
- * 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() {
+ // 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;
}
/**
* Returns a {@code Type} object that identifies the parameterized
@@ -188,24 +205,25 @@
}
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
* construct as defined by
* <cite>The Java™ Language Specification</cite>.