检索和解析方法修饰符
方法声明中可能包含一些修饰符:
-
访问修饰符:
public
,protected
和private
-
修饰符仅限一个实例:
static
-
禁止修改值的修饰符:
final
-
需要覆盖的修饰符:
abstract
-
防止重新进入的修饰符:
synchronized
-
指示以另一种编程语言实现的修饰符:
native
-
修饰符强制严格的浮点行为:
strictfp
-
Annotations
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
。由于Comparable
和String
中compareTo
方法的参数类型在擦除后不再匹配,因此不会发生覆盖。在所有其他情况下,由于未实现interface,这将产生编译时错误。bridge 方法的添加避免了此问题。
Method实现java.lang.reflect.AnnotatedElement。因此,可以检索带有java.lang.annotation.RetentionPolicy.RUNTIME的任何运行时 注解。有关获取 注解 的示例,请参见检查类修饰符和类型部分。