Java Advanced Reflection l Modifiers ABSTRACT FINAL INTERFACE
Java Advanced Reflection
Модификаторы l Класс Modifiers Константа ABSTRACT FINAL INTERFACE NATIVE PRIVATE PROTECTED PUBLIC STATIC STRICT SYNHRONIZED TRANSIENT VOLATILE Georgiy Korneev Метод is. Abstract is. Final is. Interface is. Native is. Private is. Protected is. Public is. Static is. Strict is. Synhronized is. Transient is. Volatile Java Advanced / Reflection Модификатор abstract final interface native private protected public static strictfp synhronized transient volatile 13
Поля l Открытые get. Fields() – все поля l get. Field(name) – конкретное поле l l Все get. Declared. Fields() – все поля l get. Declared. Field(name) – конкретное поле l l Исключения l No. Such. Field. Exception Georgiy Korneev Java Advanced / Reflection 14
Методы l Открытые get. Methods() – все методы l get. Method(name, Class… parameters) – конкретный метод l l Все get. Declared. Methods() – все методы l get. Declared. Method(name , Class… parameters) – конкретный метод l l Исключения l No. Such. Method. Exception Georgiy Korneev Java Advanced / Reflection 16
Конструкторы l Открытые get. Constructor() – все конструкторы l get. Constructor(Class… parameters) – конкретный конструктор l l Все get. Declared. Constructor() – все конструкторы l get. Declared. Constructor(name , Class… parameters) – конкретный конструктор l l Исключения l No. Such. Method. Exception Georgiy Korneev Java Advanced / Reflection 18
Доступ к закрытым членам По умолчанию доступ к закрытым членам запрещен Illegal. Access. Exception l Все члены extends Accessible. Object l set. Accessible(boolean) – запросить доступ l is. Accessible() – проверить доступ l Georgiy Korneev Java Advanced / Reflection 21
Пример: листинг класса Class c = Array. List. class; for (Field m : c. get. Declared. Fields()) { System. out. println(m); } for (Constructor m : c. get. Declared. Constructors()) { System. out. println(m); } for (Method m : c. get. Declared. Methods()) { System. out. println(m); } Georgiy Korneev Java Advanced / Reflection 22
Пример: создание экземпляра // Получение класса Class clazz = Integer. class; // Получение конструктора Constructor c = clazz. get. Constructor(int. class); // Создание экземпляра Integer i = (Integer) c. new. Instance(100); // Проверка System. out. println(i); Georgiy Korneev Java Advanced / Reflection 23
Имена для типов l Имена классов типов в массиве кодируются специальным образом class boolean byte char double float int long short Georgiy Korneev Lclass; Z B C D F I J S Java Advanced / Reflection 27
Пример: загрузка класса URL jar = new URL("file: //. "); class. Name = "Test"; Class. Loader cl = new URLClass. Loader(new URL[]{jar}); Class c = cl. load. Class(class. Name); Method m = c. get. Method("main", String[]. class); m. invoke(null, (Object) new String[]{"hello"}); Georgiy Korneev Java Advanced / Reflection 34
Часть 5 Proxy
Класс Invocation. Handler Ему делегируются вызовы, совершенные для Proxy l Методы l l invoke(Object proxy, Method, Object[] args) – уведомляет о вызове метода Georgiy Korneev Java Advanced / Reflection 37
Методы Proxy l Создание экземпляра Proxy l l Получение класса Proxy l l new. Proxy. Instance(Class. Loader, Class[] interfaces, Invocation. Handler) get. Proxy. Class(Class. Loader, Class[] interfaces) Проверка класса l is. Proxy. Class(Class) Georgiy Korneev Java Advanced / Reflection 38
Пример: профайлер (1) l Класс public class Profiler implements Invocation. Handler { // Экземпляр Proxy private final Object instance; // Реальная реализация private final Object impl; … } Georgiy Korneev Java Advanced / Reflection 39
Пример: профайлер (2) l Конструктор public Profiler(Class[] i 8 s, Object impl) { this. impl = impl; instance = Proxy. new. Proxy. Instance(null, i 8 s, this); } l Создание экземпляра public Object get. Instance() { return instance; } Georgiy Korneev Java Advanced / Reflection 40
Пример: профайлер (3) l Основной метод public Object invoke( Object proxy, Method method, Object[] args ) throws Illegal. Access. Exception, Invocation. Target. Exception { System. out. println("Calling " + method + " on " + impl); return method. invoke(impl, args); } Georgiy Korneev Java Advanced / Reflection 41
Пример: профайлер (4) l Применение public static void main(String[] args) { Integer i 1 = new Integer(3); Profiler profiler = new Profiler( new Class[]{Comparable. class}, i 1); Comparable i 2 = (Comparable) profiler. get. Instance(); System. out. println(i 2. compare. To(i 1)); } Georgiy Korneev Java Advanced / Reflection 42
Ссылки Reflection (Guide) // http: //java. sun. com/j 2 se/1. 5. 0/docs/guide/reflection/i ndex. html l Reflection API Code Samples // http: //java. sun. com/developer/codesamples/refl. html l Using Java Reflection // http: //java. sun. com/developer/technical. Articles/ALT/ Reflection/index. html l The Reflection API (tutorial) // http: //java. sun. com/docs/books/tutorial/reflect/index. html l Georgiy Korneev Java Advanced / Reflection 45
Вопросы Georgiy Korneev Java Advanced / Reflection 46
- Slides: 46