Google I/O Extended Budapest 2014
Ekler Péter
peter.ekler@aut.bme.hu
2014.06.25.
Reflection lehetőségei és
veszélyei Andro...
Tartalom
• Reflection alapok
• Mikor szokás használni
• Android forráskód
• Reflection demo
2 Google I/O Extended Budapest...
Reflection alapok
Google I/O Extended Budapest 20143
• API feltárása futási időben
• Mezők elérése, objektumok létrehozása...
Osztályok vizsgálata
Google I/O Extended Budapest 20144
String className =
"android.app.NotificationManager";
try {
Class ...
Konstruktorok lekérése
Google I/O Extended Budapest 20145
• getConstructors()
• getDeclaredConstructors()
• Használat: new...
Mezők elérése
Google I/O Extended Budapest 20146
• getFields()
• getDeclaredFields()
• Használat: get() és set()
Class cla...
Konkrét mező elérése név alapján
Google I/O Extended Budapest 20147
String className = "android.content.Intent";
try {
Cla...
Metódusok elérése
Google I/O Extended Budapest 20148
• getMethods()
• getDeclaredMethods()
• Használat: invoke()
Method[] ...
Annotációk elérése
Google I/O Extended Budapest 20149
• getAnnotations()
String className = "android.widget.RelativeLayout...
Osztály, mező, metódus annotációja
Google I/O Extended Budapest 201410
if(classToUse.isAnnotationPresent(
java.lang.Deprec...
Reflection loggolás céljából
Google I/O Extended Budapest 201411
• Log.v(this.getClass().getName(),
"Osztálynév mint TAG."...
Pro és kontra
Google I/O Extended Budapest 201412
• Pro:
> API futási időben való felderítése
> Framework-ök fejlesztése
>...
Reflection demo
Google I/O Extended Budapest 201413
• Hívás letevés kódból
• https://github.com/android
Akkor reflection-el mindent lehet?
Google I/O Extended Budapest 201414
•Nem
•Android Security nem kerülhető ki
(permission...
Köszönöm a figyelmet!
Google I/O Extended Budapest 201415
Upcoming SlideShare
Loading in …5
×

Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014

435 views

Published on

Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
435
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014

  1. 1. Google I/O Extended Budapest 2014 Ekler Péter peter.ekler@aut.bme.hu 2014.06.25. Reflection lehetőségei és veszélyei Android környezetben
  2. 2. Tartalom • Reflection alapok • Mikor szokás használni • Android forráskód • Reflection demo 2 Google I/O Extended Budapest 2014
  3. 3. Reflection alapok Google I/O Extended Budapest 20143 • API feltárása futási időben • Mezők elérése, objektumok létrehozása, metódusok dinamikus meghívása • java.lang.reflect csomag Android SDK része • Android: futási időben megállapítható egy API megléte (különböző Android verziók) • Tipikusan framework-ök fejlesztésére használatos • Privát API-k meghívhatósága
  4. 4. Osztályok vizsgálata Google I/O Extended Budapest 20144 String className = "android.app.NotificationManager"; try { Class notifManClass = Class.forName(className); // Osztály használata } catch (ClassNotFoundException e) { // ... } catch (Exception e) { // ... } • Belső osztályok elérése: getDeclaredClasses()
  5. 5. Konstruktorok lekérése Google I/O Extended Budapest 20145 • getConstructors() • getDeclaredConstructors() • Használat: newInstance() Class classToUse = Class.forName( "android.app.NotificationManager"); Constructor[] classConstructors = classToUse.getDeclaredConstructors(); for(Constructor c : classConstructors){ // … }
  6. 6. Mezők elérése Google I/O Extended Budapest 20146 • getFields() • getDeclaredFields() • Használat: get() és set() Class classToUse = Class.forName( "android.app.NotificationManager"); Field[] classFields = classToUse.getDeclaredFields(); for(Field f : classFields){ // ... }
  7. 7. Konkrét mező elérése név alapján Google I/O Extended Budapest 20147 String className = "android.content.Intent"; try { Class classToUse = Class.forName(className); String strNewFieldName = "EXTRA_CHANGED_PACKAGE_LIST"; Field fieldToUse = classToUse.getField(strNewFieldName); // … } catch (ClassNotFoundException e) { } catch (NoSuchFieldException e) { // Mező nem érhető el,valószínűleg Android 2.2-nél régebbi eszköz } catch (SecurityException e) { // Megtagadva } catch (Exception e) { // … }
  8. 8. Metódusok elérése Google I/O Extended Budapest 20148 • getMethods() • getDeclaredMethods() • Használat: invoke() Method[] classMethods = classToUse.getDeclaredMethods(); for(Method m : classMethods) { // … }
  9. 9. Annotációk elérése Google I/O Extended Budapest 20149 • getAnnotations() String className = "android.widget.RelativeLayout"; try { Class classToUse = Class.forName(className); Annotation[] annotations = classToUse.getDeclaredAnnotations(); for(Annotation a : annotations) { // ... } } catch (ClassNotFoundException e) { } catch (Exception e) { }
  10. 10. Osztály, mező, metódus annotációja Google I/O Extended Budapest 201410 if(classToUse.isAnnotationPresent( java.lang.Deprecated.class) == true) { // Deprecated osztály! }
  11. 11. Reflection loggolás céljából Google I/O Extended Budapest 201411 • Log.v(this.getClass().getName(), "Osztálynév mint TAG.");
  12. 12. Pro és kontra Google I/O Extended Budapest 201412 • Pro: > API futási időben való felderítése > Framework-ök fejlesztése > „Hack” • Kontra: > Lassú > Típusosság és „safe coding” előnyeinek elvesztése > „Hack”
  13. 13. Reflection demo Google I/O Extended Budapest 201413 • Hívás letevés kódból • https://github.com/android
  14. 14. Akkor reflection-el mindent lehet? Google I/O Extended Budapest 201414 •Nem •Android Security nem kerülhető ki (permission, root jogosultság…)
  15. 15. Köszönöm a figyelmet! Google I/O Extended Budapest 201415

×