След: API Reflection
Урок: Элементы
Раздел: Методы
Получение и Парсинг Модификаторов Метода
Домашняя страница > API Reflection > Элементы

Получение и Парсинг Модификаторов Метода

Там модификаторы нескольких, которые могут быть частью объявления метода:

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 может быть получен. Для примера получения аннотаций см., что раздел Исследует Модификаторы Класса и Типы.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Получение информации о Типе Метода
Следующая страница: Вызов Методов



Spec-Zone.ru - all specs in one place