在Android上获取Java字节码

时间:2015-04-20 13:42:56

标签: java android classloader dalvik

我通过以下代码片段在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 个答案:

答案 0 :(得分:0)

您可以使用dexlib2smali/baksmali的一部分)来加载和读取dex文件中的dalvik字节码。是的,它也应该可以在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
    }
}