Часто возникает необходимость во время исполнения java класса получить данные об этом же или другом классе. Это можно осуществить с помощью Reflection API.
Reflection API в Java используется для просмотра информации о классах, интерфейсах, методах, полях, конструкторах, аннотациях во время выполнения java программ.
При этом знать названия исследуемых элементов заранее не обязательно.
Все классы для работы с reflection расположены в пакете java.lang.reflect.
С помощью интерфейса Java Reflection API можно делать следующее:
- Определить класс объекта.
- Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах.
- Выяснить, какие константы и методы принадлежат интерфейсу.
- Создать экземпляр класса, имя которого неизвестно до момента выполнения программы.
- Получить и установить значение свойства объекта.
- Вызвать метод объекта.
- Создать новый массив, размер и тип компонентов которого неизвестны до момента выполнения программ.
Как пример будем использовать класс приведенный ниже:
public class People implements Serializable { private String name; private int age; public String getName(){ return this.name; } public int getAge(){ return this.age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.name = age; } @Deprecated protected static void method(String[] params) { } }
Получение объекта типа Class
People people = new People(); Class myClass = people.getClass();
Самое простое, что обычно делается в динамическом программировании, — это получают объект типа java.lang.Class.
Если у нас есть экземпляр объекта Class мы можем получить всевозможную информацию об этом классе и даже осуществлять операции над ним. Вышеприведенный метод getClass() часто полезен тогда когда есть экземпляр объекта, но не известно какого класса этот экземпляр.
Если у нас есть класс, для которого в момент компиляции известен тип, то получить экземпляр класса ещё проще.
Class myClass = People.class;
Если имя класса не известно в момент компиляции, но становится известным во время выполнения программы, можно использовать метод forName(), чтобы получить объект Class.
Class c = Class.forName("com.mysql.jdbc.Driver");
Получение пакета
Package p = clazz.getPackage(); System.out.println("package " + p.getName() + ";");
Выводим интерфейсы, которые реализует класс
Class[] interfaces = myClass.getInterfaces(); for (int i = 0, size = interfaces.length; i < size; i++) { System.out.print(i == 0 ? "implements " : ", "); System.out.print(interfaces[i].getSimpleName()); } System.out.println(" {");
Выводим поля класса
Package p = clazz.getPackage(); System.out.println("package " + p.getName() + ";");
Выводим интерфейсы, которые реализует класс
Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println("\t" + getModifiers(field.getModifiers()) + getType(field.getType()) + " " + field.getName() + ";"); }
Выводим методы, аннотации класса
Method[] methods = clazz.getDeclaredMethods(); for (Method m : methods) { Annotation[] annotations = m.getAnnotations(); System.out.print("\t"); for (Annotation a : annotations) System.out.print("@" + a.annotationType().getSimpleName() + " "); System.out.println(); System.out.print("\t" + getModifiers(m.getModifiers()) + getType(m.getReturnType()) + " " + m.getName() + "("); System.out.print(getParameters(m.getParameterTypes())); System.out.println(") { }"); }Ресурс: www.devcolibri.com
Немає коментарів:
Дописати коментар