Spec-Zone .ru
спецификации, руководства, описания, API
|
Там модификаторы нескольких, которые могут быть частью объявления метода:
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()
возвраты true
для Class.getConstructor()
public Constructor<T> getConstructor(Class<?>... parameterTypes)
не как это:
public Constructor<T> getConstructor(Class<?> [] parameterTypes)
Заметьте что вывод для String.compareTo()
String.java
:
public int compareTo(String anotherString);
и второй синтетический или сгенерированный компилятором мостовой метод. Это происходит потому что String
Comparable
Comparable.compareTo()
java.lang.Object
к java.lang.String
. Так как параметр вводит для compareTo
методы в Comparable
и String
больше соответствие после стирания, переопределение не может произойти. При всех других обстоятельствах это произвело бы ошибку времени компиляции, потому что интерфейс не реализуется. Добавление мостового метода избегает этой проблемы.
Method
java.lang.reflect.AnnotatedElement
java.lang.annotation.RetentionPolicy.RUNTIME