为了账号安全,请及时绑定邮箱和手机立即绑定

如何在android / dalvik上动态加载Java类?

如何在android / dalvik上动态加载Java类?

牛魔王的故事 2019-10-08 10:03:31
我想知道是否以及如何在dalvik中动态加载dex或class文件,我编写的一些快速的“肮脏”测试函数是这样的:    public void testLoader() {             InputStream in;             int len;             byte[] data = new byte[2048];             try {                     in = context.getAssets().open("f.dex");                     len = in.read(data);                     in.close();                     DexFile d;                     Class c = defineClass("net.webvm.FooImpl", data, 0, len);                     Foo foo = (Foo)c.newInstance();             } catch (IOException e1) {                     // TODO Auto-generated catch block                     e1.printStackTrace();             } catch (IllegalAccessException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();             } catch (InstantiationException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();             }     } 而Foo界面是这样    public interface Foo {             int get42();     } f.dex包含该接口的某些dx实现:    public class FooImpl implements Foo {             public int get42() {                     return 42;             }     } 上面的测试驱动程序抛出了defineClass(),它不起作用,我研究了dalvik代码并发现了这一点:http://www.google.com/codesearch/p?hl=zh_CN#atE6BTe41-M/vm/Jni.c&q=Jni.c ...所以我想知道是否有人可以启发我,这是否可以通过其他方式实现或不应该实现。如果不可能,那么谁能提供无法实现的理由?
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

Dalvik测试套件中有一个DexClassLoader 示例。它以反射方式访问类加载器,但是如果您要针对Android SDK进行构建,则可以执行以下操作:


String jarFile = "path/to/jarfile.jar";

DexClassLoader classLoader = new DexClassLoader(

    jarFile, "/tmp", null, getClass().getClassLoader());

Class<?> myClass = classLoader.loadClass("MyClass");

为此,jar文件应包含名为的条目classes.dex。您可以dx使用SDK附带的工具来创建这样的jar 。


查看完整回答
反对 回复 2019-10-08
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我尝试使用DexClassLoader,但这也不起作用。我创建了一个派生类,并使用super(“ / sdcard / f.jar”,“ / sdcard”,null,getSystemClassLoader())称为超构造函数;但是没有成功。defineClass和findClass都不会返回动态附加的任何类。我的怀疑是android根本不支持此功能,否则正常的defineClass应该已经可以工作了。可能是由于某些安全问题。但我一定想听听原因,我也在android-developers Google组上启动了一个线程。

查看完整回答
反对 回复 2019-10-08
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

DexClassLoader可以正常工作,如源树中的dalvik / tests / 068-classloader所示。需要“插件”体系结构的应用程序使用它。请记住,只有通过自定义类加载器才能看到该类。

查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信