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卡权限。