1.解决频繁更新的问题。
在实现android动态添加dex前,我们先来实现java的动态添加jar包,毕竟这是祖先,而且相对也简单些!
1.用于把jar添加进Classloader的方法:
static void addJarToClassLoader(String jarPath) throws NoSuchMethodException, SecurityException, MalformedURLException{
File libPath = new File(jarPath);// 系统类库路径
File[] jarFiles = libPath.listFiles(new FilenameFilter() {// 获取所有的.jar和.zip文件
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".jar") || name.endsWith(".zip");
}
});
if (jarFiles != null) {
// 从URLClassLoader类中获取类所在文件夹的方法
// 对于jar文件,可以理解为一个存放class文件的文件夹
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
boolean accessible = method.isAccessible(); // 获取方法的访问权限
try {
if (accessible == false) {
method.setAccessible(true); // 设置方法的访问权限
}
// 获取系统类加载器
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
for (File file : jarFiles) {
URL url = file.toURI().toURL();
try {
method.invoke(classLoader, url);
System.out.printf("读取jar文件[name={}]", file.getName());
} catch (Exception e) {
System.err.printf("读取jar文件[name={}]失败", file.getName());
}
}
} finally {
method.setAccessible(accessible);
}
}
}
2.一个被加载的jar包(我自己实现的一个测试包,若不想麻烦,直接下载这个即可。
http://download.csdn.net/download/qq_26914291/10039692
3.一个用于加载jar的主程序。
3.可以正常开发java项目的eclipse。
1.创建一个简单的包含main入口的程序即可。
public static void main(String[] args) {
}
1.把测试包放在C:/jar/
文件夹下(路径可以自己定义)。
2.用eclipse->右键菜单->构建路径->添加库->用户库->下一步。
3.点击右上角用户库->新建->输入用户库名称(一定要勾选系统库)->点击确定.
4.然后用户库列表就会出现刚新建的库->然后添加外部jar->将刚C:/jar/
下jar测试包添加进去。
测试包添加完毕!
1.将jar添加进系统ClassLoader
private final static String jarPath="C:/jar/";
public static void main(String[] args) {
try {
addJarToClassLoader(jarPath);
} catch (Exception e) {
System.err.println(e);
e.printStackTrace();
}
}
2.然后调用jar包里函数,再通过打印函数打印返回值
System.out.println("ischina:"+larson.mtest.jarloadtest.LanguageUtils.ischina("哈哈"));
我这里的测试包实现的是一个判断输入字符是否中文的的方法。
3.打印结果:
ischina:true
OK!调用成功!哈哈!
1.addJarToClassLoader(jarPath);函数一定要放在打印函数之前执行.
2.jar路径为C:/jar/
是一个文件夹路径,不是jar文件路径!
3.添加用户库时,一定要勾选系统库选项,具体原因就是如果不勾选,则测试包包就会编译进当前java项目中。
1.这样动态调用jar包就不用使用麻烦的反射调用了,就跟正常调用函数一样!
1.学会了java如何加载其它的jar文件!
2.学会了以一种更加便捷的方式调用其它jar包文件里的类!
1.用于将jar包加载进ClassLoader的方法:
void addJarToClassLoader(String jarPath){
File optimizedDexOutputPath = new File(jarPath);
DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),Environment.getExternalStorageDirectory().toString(), null, getClassLoader());
}
1.动态加载dex的两种方式
2.Java中动态加载jar文件和class文件
3.Android动态加载jar/dex
4.深入浅出Android动态加载jar包技术
5.Android动态加载外部jar包及jar包中图片等资源文件
6.Android动态加载入坑指南