检索和解析方法修饰符

方法声明中可能包含一些修饰符:

MethodModifierSpy示例列出了具有给定名称的方法的修饰符。它还显示该方法是合成的(由编译器生成的),可变变量的方法还是 bridge 的方法(由编译器生成以支持通用interface的)。

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实现了参数化的interfaceComparable。在类型擦除期间,继承的方法Comparable.compareTo()的参数类型从java.lang.Object更改为java.lang.String。由于ComparableStringcompareTo方法的参数类型在擦除后不再匹配,因此不会发生覆盖。在所有其他情况下,由于未实现interface,这将产生编译时错误。bridge 方法的添加避免了此问题。

Method实现java.lang.reflect.AnnotatedElement。因此,可以检索带有java.lang.annotation.RetentionPolicy.RUNTIME的任何运行时 注解。有关获取 注解 的示例,请参见检查类修饰符和类型部分。

首页