文档

Java™ 教程-Java Tutorials 中文版
获取和解析方法修饰符
Trail: The Reflection API
Lesson: Members
Section: Methods

获取和解析方法修饰符

有几个修饰符可能是方法声明的一部分:

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。由于 ComparableStringcompareTo 方法的参数类型在擦除后不再匹配,因此不能进行覆盖。在所有其他情况下,这将产生编译时错误,因为未实现接口。增加桥接方法可以避免这个问题。

方法实现 java.lang.reflect.AnnotatedElement。因此,可以获取具有 java.lang.annotation.RetentionPolicy.RUNTIME 的任何运行时注解。有关获取注解的示例,请参阅 Examining Class Modifiers and Types 部分。


Previous page: Obtaining Names of Method Parameters
Next page: Invoking Methods