DexClassLoader如何加载dex\dex.jar文件

本文介绍了DexClassLoader的使用,包括如何加载dex和dex.jar文件。讲解了DexClassLoader的构造参数意义,并提供了将java文件转换为dex.jar的流程。通过将生成的dex.jar放置在手机根目录,然后通过反射调用jar包内的类,实现了DexClassLoader的初步应用。记得在测试时申请SD卡权限。

DexClassLoader的初步使用

DexClassLoader可以加载apk、jar、dex格式的文件,接下来我会使用DexClassLoader如何加载dex文件和jar文件。
首先看一下DexClassLoader这个类需要传什么参数

public class DexClassLoader extends BaseDexClassLoader {
    public DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) {
        super((String)null, (File)null, (String)null, (ClassLoader)null);
        throw new RuntimeException("Stub!");
    }
}

dexPath:加载的资源路径;
optimizedDirectory:资源文件的解压路劲;
librarySearchPath:没用过,还不清楚;
parent:类加载器;

这里我们需要把java文件转化成dex或者dex.jar,可以看我另一篇博客如何转化的:[class如何转化dex]。(https://blog.youkuaiyun.com/u012911421/article/details/89705502)转化好后我们把生成的dex.jar放到手机路径下,我放的是手机跟目录;

直接上代码:

public void dexClassLoader(){
        File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + "dex.jar");
        File dexOutputDir = this.getDir(".dex",0);
        DexClassLoader dexClassLoader = new DexClassLoader(path.getAbsolutePath(),dexOutputDir.getAbsolutePath(),null,getClassLoader());
        try {
            Class c = dexClassLoader.loadClass("com.example.lenovo.testwidget.widget.TestDex");
            Method method = c.getMethod("getDexStr");
            Object obj = c.newInstance();
            String object = (String)method.invoke(obj);
            Toast.makeText(getApplicationContext(),object,Toast.LENGTH_SHORT).show();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述
dex.jar是我生成的jar包,里边是两个class文件,把这这两个类转化成dex文件的jar包,注意里边是dex文件哦
在这里插入图片描述
jar包解压后是这样的
在这里插入图片描述
这样我们就可以调用TestDex和TestDex2这两个类了,通过反射调用。简单的话就写个接口,让这两个类都实现这个接口,反射时拿到对象转化成接口对象就可以方便的使用了;这样DexClassLoader初步使用就完成了。
最后测试的时候别忘了申请sd卡权限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值