Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
有几个修饰符可能是方法声明的一部分:
public
,protected
和 private
static
final
abstract
synchronized
native
strictfp
示例列出了具有给定名称的方法的修饰符。它还显示方法是合成的(编译器生成的),可变数量的,或是桥接方法(编译器生成的以支持泛型接口)。MethodModifierSpy
import java.lang.reflect.Method; import java.lang.reflect.Modifier; import static java.lang.System.out; public class MethodModifierSpy { private static int count; private static synchronized void inc() { count++; } private static synchronized int cnt() { return count; } public static void main(String... args) { try { Class<?> c = Class.forName(args[0]); Method[] allMethods = c.getDeclaredMethods(); for (Method m : allMethods) { if (!m.getName().equals(args[1])) { continue; } out.format("%s%n", m.toGenericString()); out.format(" Modifiers: %s%n", Modifier.toString(m.getModifiers())); out.format(" [ synthetic=%-5b var_args=%-5b bridge=%-5b ]%n", m.isSynthetic(), m.isVarArgs(), m.isBridge()); inc(); } out.format("%d matching overload%s found%n", cnt(), (cnt() == 1 ? "" : "s")); // production code should handle this exception more gracefully } catch (ClassNotFoundException x) { x.printStackTrace(); } } }
输出
的一些示例生成如下。MethodModifierSpy
$ java MethodModifierSpy java.lang.Object wait public final void java.lang.Object.wait() throws java.lang.InterruptedException Modifiers: public final [ synthetic=false var_args=false bridge=false ] public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException Modifiers: public final [ synthetic=false var_args=false bridge=false ] public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException Modifiers: public final native [ synthetic=false var_args=false bridge=false ] 3 matching overloads found
$ java MethodModifierSpy java.lang.StrictMath toRadians public static double java.lang.StrictMath.toRadians(double) Modifiers: public static strictfp [ synthetic=false var_args=false bridge=false ] 1 matching overload found
$ java MethodModifierSpy MethodModifierSpy inc private synchronized void MethodModifierSpy.inc() Modifiers: private synchronized [ synthetic=false var_args=false bridge=false ] 1 matching overload found
$ java MethodModifierSpy java.lang.Class getConstructor public java.lang.reflect.Constructor<T> java.lang.Class.getConstructor (java.lang.Class<T>[]) throws java.lang.NoSuchMethodException, java.lang.SecurityException Modifiers: public transient [ synthetic=false var_args=true bridge=false ] 1 matching overload found
$ java MethodModifierSpy java.lang.String compareTo public int java.lang.String.compareTo(java.lang.String) Modifiers: public [ synthetic=false var_args=false bridge=false ] public int java.lang.String.compareTo(java.lang.Object) Modifiers: public volatile [ synthetic=true var_args=false bridge=true ] 2 matching overloads found
请注意 Method.isVarArgs()
为 Class.getConstructor()
返回 true
。这表明方法声明如下所示:
public Constructor<T> getConstructor(Class<?>... parameterTypes)
而不是这样的:
public Constructor<T> getConstructor(Class<?> [] parameterTypes)
请注意,String.compareTo()
的输出包含两种方法。在 String.java
中声明的方法:
public int compareTo(String anotherString);
和第二个 synthetic (合成) 或编译器生成的 bridge (桥接) 方法。发生这种情况是因为 String
实现了参数化接口 Comparable
。在类型擦除期间,继承方法 Comparable.compareTo()
的参数类型从 java.lang.Object
更改为 java.lang.String
。由于 Comparable
和 String
中 compareTo
方法的参数类型在擦除后不再匹配,因此不能进行覆盖。在所有其他情况下,这将产生编译时错误,因为未实现接口。增加桥接方法可以避免这个问题。
方法
实现 java.lang.reflect.AnnotatedElement
。因此,可以获取具有 java.lang.annotation.RetentionPolicy.RUNTIME
的任何运行时注解。有关获取注解的示例,请参阅 Examining Class Modifiers and Types 部分。