Upload
gdg-budapest
View
265
Download
0
Embed Size (px)
Citation preview
Google I/O Extended Budapest 2014
Ekler Péter
2014.06.25.
Reflection lehetőségei és veszélyei Android környezetben
Tartalom
• Reflection alapok
• Mikor szokás használni
• Android forráskód
• Reflection demo
2 Google I/O Extended Budapest 2014
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
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()
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){
// …
}
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){
// ...
}
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) {
// …
}
Metódusok elérése
Google I/O Extended Budapest 20148
• getMethods()
• getDeclaredMethods()
• Használat: invoke()
Method[] classMethods =
classToUse.getDeclaredMethods();
for(Method m : classMethods)
{
// …
}
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) {
}
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!
}
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
> „Hack”
• Kontra:> Lassú
> Típusosság és „safe coding” előnyeinek elvesztése
> „Hack”
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, root jogosultság…)
Köszönöm a figyelmet!
Google I/O Extended Budapest 201415