reflection lehetőségei és veszélyei android környezetben - google i/o extended budapest 2014
TRANSCRIPT
![Page 1: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/1.jpg)
Google I/O Extended Budapest 2014
Ekler Péter
2014.06.25.
Reflection lehetőségei és veszélyei Android környezetben
![Page 2: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/2.jpg)
Tartalom
• Reflection alapok
• Mikor szokás használni
• Android forráskód
• Reflection demo
2 Google I/O Extended Budapest 2014
![Page 3: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/3.jpg)
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
![Page 4: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/4.jpg)
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()
![Page 5: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/5.jpg)
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){
// …
}
![Page 6: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/6.jpg)
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){
// ...
}
![Page 7: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/7.jpg)
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) {
// …
}
![Page 8: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/8.jpg)
Metódusok elérése
Google I/O Extended Budapest 20148
• getMethods()
• getDeclaredMethods()
• Használat: invoke()
Method[] classMethods =
classToUse.getDeclaredMethods();
for(Method m : classMethods)
{
// …
}
![Page 9: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/9.jpg)
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) {
}
![Page 10: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/10.jpg)
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!
}
![Page 11: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/11.jpg)
Reflection loggolás céljából
Google I/O Extended Budapest 201411
• Log.v(this.getClass().getName(),
"Osztálynév mint TAG.");
![Page 12: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/12.jpg)
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”
![Page 13: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/13.jpg)
Reflection demo
Google I/O Extended Budapest 201413
• Hívás letevés kódból
• https://github.com/android
![Page 14: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/14.jpg)
Akkor reflection-el mindent lehet?
Google I/O Extended Budapest 201414
•Nem
•Android Security nem kerülhető ki (permission, root jogosultság…)
![Page 15: Reflection lehetőségei és veszélyei Android környezetben - Google I/O Extended Budapest 2014](https://reader034.vdocuments.net/reader034/viewer/2022042817/55a0779c1a28abb7128b460c/html5/thumbnails/15.jpg)
Köszönöm a figyelmet!
Google I/O Extended Budapest 201415