Your SlideShare is downloading. ×
2012 10 31_java_lecture08
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

2012 10 31_java_lecture08

1,503
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,503
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Стандартная библиотека Java: Reflection API Алексей Владыкин 31 октября 2012Алексей Владыкин Reflection API 31 октября 2012 1 / 26
  • 2. 1 Аннотации2 Reflection API Алексей Владыкин Reflection API 31 октября 2012 2 / 26
  • 3. Аннотации1 Аннотации2 Reflection API Алексей Владыкин Reflection API 31 октября 2012 3 / 26
  • 4. АннотацииАннотации — это метаданные, сопровождающие исполняемый кодВ отличие от Javadoc, являются машиночитаемыми и могут бытьдоступны во время исполненияПримеры аннотаций: @Override @Deprecated @SuppressWarningsАлексей Владыкин Reflection API 31 октября 2012 4 / 26
  • 5. АннотацииЧто можно аннотировать Пакет Тип (класс, интерфейс, enum) Поле класса Метод, конструктор Параметр метода Локальная переменная Алексей Владыкин Reflection API 31 октября 2012 5 / 26
  • 6. АннотацииГде можно анализировать аннотации Во время компиляции (Annotation Processing API) В скомпилированных class-файлах (статический анализ FindBugs) Во время исполнения программы (Reflection API) Алексей Владыкин Reflection API 31 октября 2012 6 / 26
  • 7. АннотацииСоздание аннотацииpackage ru . compscicenter . java2012 . annotations ;import java . lang . annotation .*;@Retention ( RetentionPolicy . RUNTIME )@Target ( ElementType . TYPE )public @interface Version { String value (); String date () default " " ;} Аннотация является особым видом класса: extends Object implements Annotation Алексей Владыкин Reflection API 31 октября 2012 7 / 26
  • 8. АннотацииИспользование аннотацииpackage ru . compscicenter . java2012 . annotations ;@Version ( value = " 1.3.44 " , date = " 01.01.2011 " )public class Component { // ...} Экземпляр аннотации является объектом, у которого можно вызвать методы value() и date() Нельзя создать экземпляр аннотации вызовом new Алексей Владыкин Reflection API 31 октября 2012 8 / 26
  • 9. АннотацииГде применяются аннотации JUnit Java API for XML Binding (JAXB) Java Persistence API (JPA) Алексей Владыкин Reflection API 31 октября 2012 9 / 26
  • 10. Reflection API1 Аннотации2 Reflection API Алексей Владыкин Reflection API 31 октября 2012 10 / 26
  • 11. Reflection APIReflection API — программный интерфейс для полученияинформации об объектах и их классах во время исполненияпрограммыЦентральный класс — java.lang.reflect.ClassДля каждого класса, загруженного в JVM, можно получитьописывающий его экземпляр класса ClassАлексей Владыкин Reflection API 31 октября 2012 11 / 26
  • 12. Reflection APIВозможности Reflection API Получение списка конструкторов, методов и полей класса Создание экземпляров класса Вызов методов и чтение запись полей, в том числе закрытых Алексей Владыкин Reflection API 31 октября 2012 12 / 26
  • 13. Reflection APIОткуда берутся Class’ы Получение класса по объекту: Class c1 = ref.getClass(); Получение класса по имени: Class c2 = Class.forName("java.lang.Integer"); Литералы: Class c3 = String.class; Алексей Владыкин Reflection API 31 октября 2012 13 / 26
  • 14. Reflection APIОткуда берутся Class’ы Получение класса по имени, при этом класс может не входить в classpath запущенной JVM:URL jarFileURL = new URL ( " file :// electro . jar " );ClassLoader classLoader = new URLClassLoader ( new URL [] { jarFileURL });Class c4 = classLoader . loadClass ( " ElectroSolver " ); Алексей Владыкин Reflection API 31 октября 2012 14 / 26
  • 15. Reflection APIИмя класса int[] Object[] Foo.Bar getName() [I Ljava.lang.Object; Foo$Bar getCanonicalName() int[] java.lang.Object[] Foo.Bar getSimpleName() int[] Object[] Bar Алексей Владыкин Reflection API 31 октября 2012 15 / 26
  • 16. Reflection APIАннотацииVersion version = clazz . getAnnotation ( Version . class );String versionNumber = version . value ();String versionDate = version . date (); Алексей Владыкин Reflection API 31 октября 2012 16 / 26
  • 17. Reflection APIИерархия классов boolean isPrimitive() boolean isInterface() boolean isAnnotation() Class getSuperclass() Class[] getInterfaces() Алексей Владыкин Reflection API 31 октября 2012 17 / 26
  • 18. Reflection APIСпецифика массивовif ( clazz . isArray ()) { System . out . println ( " Array of " + c . getComponentType ());} Алексей Владыкин Reflection API 31 октября 2012 18 / 26
  • 19. Reflection APIСпецифика enumif ( clazz . isEnum ()) { System . out . println ( " Enum of : " ); for ( Object e : clazz . getEnumConstants ()) { System . out . println ( e ); }} Алексей Владыкин Reflection API 31 октября 2012 19 / 26
  • 20. Reflection APIКонструкторы Открытые конструкторы: Constructor getConstructor(Class... types) Constructor[] getConstructors() Все конструкторы: Constructor getDeclaredConstructor(Class... types) Constructor[] getDeclaredConstructors() Алексей Владыкин Reflection API 31 октября 2012 20 / 26
  • 21. Reflection APIВызов конструктораConstructor constructor = clazz . getConstructor ( String . class );Object instance = constructor . newInstance ( " Hello World ! " ); Алексей Владыкин Reflection API 31 октября 2012 21 / 26
  • 22. Reflection APIМетоды Открытые методы, в том числе унаследованные: Method getMethod(String name, Class... types) Method[] getMethods() Все методы, но только из текущего класса: Method getDeclaredMethod(String name, Class... types) Method[] getDeclaredMethods() Алексей Владыкин Reflection API 31 октября 2012 22 / 26
  • 23. Reflection APIВызов методаMethod method = clazz . getMethod ( " doSomething " , int . class );Object result = method . invoke ( instance , 42); Алексей Владыкин Reflection API 31 октября 2012 23 / 26
  • 24. Reflection APIПоля Открытые поля, в том числе унаследованные: Field getField(String name) Field[] getFields() Все поля, но только из текущего класса: Field getDeclaredField(String name) Field[] getDeclaredFields() Алексей Владыкин Reflection API 31 октября 2012 24 / 26
  • 25. Reflection APIЧтение/запись поляField field = clazz . getDeclaredField ( " x " );field . setAccessible ( true );Object value = field . get ( instance );field . set ( instance , null ); Алексей Владыкин Reflection API 31 октября 2012 25 / 26
  • 26. Что сегодня узнали Что такое аннотации в Java и как их можно использовать Что такое Reflection API и какие возможности он предоставляет Алексей Владыкин Reflection API 31 октября 2012 26 / 26