# 检索和解析方法修饰符

> 原文： [https://docs.oracle.com/javase/tutorial/reflect/member/methodModifiers.html](https://docs.oracle.com/javase/tutorial/reflect/member/methodModifiers.html)

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

*   访问修饰符：`public`，`protected`和`private`
*   修饰符限制为一个实例：`static`
*   修饰符禁止修改值：`final`
*   需要覆盖的修改器：`abstract`
*   防止重入的修饰符：`synchronized`
*   修饰符指示以另一种编程语言实现：`native`
*   修饰符强制严格浮点行为：`strictfp`
*   注释

[``MethodModifierSpy`` ](example/MethodModifierSpy.java)示例列出了具有给定名称的方法的修饰符。它还显示方法是合成的（编译器生成的），可变的 arity 还是桥接方法（编译器生成以支持通用接口）。

```
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``](example/MethodModifierSpy.java)的一些例子产生如下。

```
$ 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()`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#isVarArgs--) 返回 [`Class.getConstructor()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getConstructor-java.lang.Class...-) 的`true`。这表明方法声明如下所示：

```
public Constructor<T> getConstructor(Class<?>... parameterTypes)

```

不是这样的：

```
public Constructor<T> getConstructor(Class<?> [] parameterTypes)

```

请注意， [`String.compareTo()`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-) 的输出包含两种方法。在`String.java`中声明的方法：

```
public int compareTo(String anotherString);

```

和第二 _ 合成 _ 或编译器生成的 _ 桥 _ 方法。发生这种情况是因为 [`String`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) 实现了参数化界面 [`Comparable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) 。在类型擦除期间，继承方法 [`Comparable.compareTo()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-) 的参数类型从`java.lang.Object`更改为`java.lang.String`。由于`Comparable`和`String`中`compareTo`方法的参数类型在擦除后不再匹配，因此不会发生覆盖。在所有其他情况下，这将产生编译时错误，因为未实现接口。增加桥接方法可以避免这个问题。

[`Method`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html) 实现 [`java.lang.reflect.AnnotatedElement`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html) 。因此，可以检索具有 [`java.lang.annotation.RetentionPolicy.RUNTIME`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html#RUNTIME) 的任何运行时注释。有关获取注释的示例，请参见[检查类修饰符和类型](../class/classModifiers.html)部分。