2015-04-20 7 views
0

Я динамически загружаю классы на Android через следующий код sniplet.Получить Java Bytecode на Android

if(classes.size() > 0) { 
    // Located classes.load and scan them for interfaces. 
    DexClassLoader dx = new DexClassLoader(szPath,outdex,null,  c.getClassLoader()); 
    for(String sz : classes) { 
     Class<?> cls = dx.loadClass(sz); 
     for(Class<?> i : cls.getInterfaces()) { 
      if(i.getName().contains("IPinPad") == true) { 
       // This is a PinPad. 
       return (IPinPad)cls.newInstance(); 
      } 
     } 
    } 
} 

классы содержат список классов, опущенных в файл dex из предыдущего кода запуска Цель этого кода - вернуть экземпляры объектов, которые реализуют декларацию интерфейса IPinPad. Все это прекрасно работает, но, кроме того, я хотел бы взять байтовый код для объекта cls.newInstance(). Как мне это сделать?

Я играл с cls.getClassLoader().getResourceAsStream();, но он всегда возвращает пустой поток, не зная, как указать ресурс для класса.

+1

Вы не можете получить байт-код Java из файла DEX, так как его там нет. Теоретически вы можете получить байт-код Dalvik, хотя в зависимости от вашей конечной цели, вероятно, будет проще просто открыть DEX-файл и прочитать его. – fadden

ответ

0

Вы можете использовать dexlib2 (часть smali/baksmali), чтобы загрузить и прочитать байт-код dalvik в файле dex. И да, его также следует использовать в приложении для Android.

DexFile dexFile = DexFileFactory.loadDexFile("/blah/blah.dex", android.os.Build.VERSION.SDK_INT); 
for (ClassDef classDef: dexFile.getClasses()) { 
    if (classDef.getType().equals("Lthe/class/to/look/for;")) { 
     // handle/inspect/process the class as needed 
    } 
} 
Смежные вопросы