Читайте также:
|
|
package ShowClass.java;import java.lang.reflect.*; /** Программа, выдающая краткое описание класса, заданного по имени */public class ShowClass { /** Метод main(). Печатает информацию о заданном классе */ public static void main(String[] args) throws ClassNotFoundException { Class c = Class.forName(args[0]); print_class(c); } /** *Отображаем модификаторы, имя, родительский класс и интерфейсы *класса или интерфейса. Затем выводим список его конструкторов, полей и методов. **/ public static void print_class(Class c) { // Печатаем модификаторы, тип (класс или интерфейс), имя, // родительский класс. if (c.isInterface()) { // Модификаторы будут здесь включать в себя ключевое слово // «Interface»... System.out.print(Modifier.toString(c.getModifiers()) + " " + typename(c)); } else if (c.getSuperclass()!= null) { System.out.print(Modifier.toString(c.getModifiers()) + " class " + typename(c) + " extends " + typename(c.getSuperclass())); } else { System.out.print(Modifier.toString(c.getModifiers()) + " class " + typename(c)); } // Печатаем интерфейсы или суперинтерфейсы класса или интерфейса. Class[] interfaces = c.getInterfaces(); if ((interfaces!= null)&& (interfaces.length > 0)) { if (c.isInterface()) System.out.print(" extends "); else System.out.print(" implements "); for(int i = 0; i < interfaces.length; i++) { if (i > 0) System.out.print(", "); System.out.print(typename(interfaces[i])); } } System.out.println(" {"); // Начало списка членов класса. // Теперь просматриваем и печатаем члены класса. System.out.println(" // Constructors"); Constructor[] constructors = c.getDeclaredConstructors(); for(int i = 0; i < constructors.length; i++) // Выводим конструкторы. print_method_or_constructor(constructors[i]); System.out.println(" // Fields"); Field[] fields = c.getDeclaredFields(); // Просматриваем поля. for(int i = 0; i < fields.length; i++) // Отображаем их. print_field(fields[i]); System.out.println(" // Methods"); Method[] methods = c.getDeclaredMethods(); // Просматриваем методы. for(int i = 0; i < methods.length; i++) // Отображаем их. print_method_or_constructor(methods[i]); System.out.println("}"); // Конец списка членов класса. } /** Возвращаем имя интерфейса или примитивного типа, обрабатывая массивы. */ public static String typename(Class t) { String brackets = ""; while(t.isArray()) { brackets += "[]"; t = t.getComponentType(); } String name = t.getName(); int pos = name.lastIndexOf('.'); if (pos!= -1) name = name.substring(pos+1); return name + brackets; } /** Возвращаем строковую версию модификаторов, для красоты применяем пробелы. */ public static String modifiers(int m) { if (m == 0) return ""; else return Modifier.toString(m) + " "; } /** Печатаем модификаторы, тип и имя поля свойств. */ public static void print_field(Field f) { System.out.println(" " + modifiers(f.getModifiers()) + typename(f.getType()) + " " + f.getName() + ";"); } /** * Печатаем модификаторы, возвращаем тип, имя, типы параметров и типы * исключений метода или конструктора. Обратите внимание на *использование интерфейса Member, позволяющее этому методу работать * как с объектами Method, так и с объектами типа Constructor **/ public static void print_method_or_constructor(Member member) { Class returntype=null, parameters[], exceptions[]; if (member instanceof Method) { Method m = (Method) member; returntype = m.getReturnType(); parameters = m.getParameterTypes(); exceptions = m.getExceptionTypes(); System.out.print(" " + modifiers(member.getModifiers()) + typename(returntype) + " " + member.getName() + "("); } else { Constructor c = (Constructor) member; parameters = c.getParameterTypes(); exceptions = c.getExceptionTypes(); System.out.print(" " + modifiers(member.getModifiers()) + typename(c.getDeclaringClass()) + "("); } for(int i = 0; i < parameters.length; i++) { if (i > 0) System.out.print(", "); System.out.print(typename(parameters[i])); } System.out.print(")"); if (exceptions.length > 0) System.out.print(" throws "); for(int i = 0; i < exceptions.length; i++) { if (i > 0) System.out.print(", "); System.out.print(typename(exceptions[i])); } System.out.println(";"); }}
В следующем примере продемонстрировано еще одно использование API Reflection с определением класса Command – вызов метода, заданного по имени. Класс Command содержит объект Method, а массив переменных, передаваемых этому методу будет включать в себя имена аргументов методов. В классе Command существует метод parse (), позволяющий определить имя метода и список аргументов для создания объекта.
Java не позволяет передавать методы напрямую, как данные, но API Reflection делает возможным косвенный вызов методов, заданных их именами.
Дата добавления: 2015-09-11; просмотров: 84 | Поможем написать вашу работу | Нарушение авторских прав |