15
Google I/O Extended Budapest 2014 Ekler Péter [email protected] 2014.06.25. Reflection lehetőségei és veszélyei Android környezetben

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

Embed Size (px)

Citation preview

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

Google I/O Extended Budapest 2014

Ekler Péter

[email protected]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Köszönöm a figyelmet!

Google I/O Extended Budapest 201415