<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">对于做客户端,最烦恼的事情就是。今天升级以后,明天客户反响了一大堆的问题,然后要想解决 就必须再次升级客户端。</span>
1,升级的时候比较着急,代码写的时候出现bug了(大多是空指针的出现,或者条件写错了,或其他)。
2,我们假设的条件不符合当前软件的环境了。
但是呢,用户对频繁升级特别反感,一直想能不能将代码放到服务器端,像WEB那种。有错误了我只需要更新客户端的代码,客户端再次浏览就可以正常运行了。
其实有两种解决办法,(对于android)
1,默默的升级android 客户端 所谓的静默安装,但是这种比较难实现(对于大多android机器,也有权限限制)
2,我的设想是,把自己觉得可能会出现问题的代码在升级之前客户端定义好一些列的接口,将实现放到服务器上。然后通过网络将自己的jar down本地。通过jar 的动态加载机制加载jar文件,通过java 的反射机制调用我们实现类。
好了不多说了,我对这个动态加载 jar 文件 以及利用泛型 得到对应的实例
package com.cyl.utils;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
/**
* 动态加载jar 文件 通过本地文件 或者 网络文件
* @author cyl
*
* 2016-2-12
*/
public class LoadJarFile {
//本地文件地址
private String localPath;
//自定义的类加载器
private static MyClassLoader classLoader;
public LoadJarFile(String localPath) {
super();
this.localPath = localPath;
init();
}
/**
* 初始化classloader
*/
private void init() {
if(classLoader != null){
return;
}
try {
URL[] urls = new URL[] {};
classLoader = new MyClassLoader(urls, Thread.currentThread().getContextClassLoader());
classLoader.addJar(new File(localPath).toURI().toURL());
} catch (Exception e) {
}
}
/**
* 通过类名得到对应的类的实例
* @param clz 得到对象的对应类型
* @param className 类的全名
* @return
*/
public <T> T getClassByJar(Class<T> clz,String className){
try {
if(classLoader!=null){
Class<?> class1 = classLoader.loadClass(className);
if(class1 != null){
Object o = class1.newInstance();
return (T) o;
}
}
} catch (Exception e) {
//这里没有做太多的处理 如:类名字出错了,以及 jar 文件的地址出错了
return null;
}
return null;
}
/**
* 自定义的classloader
* @author cyl
*
* 2016-2-12
*/
static class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls) {
super(urls);
}
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public void addJar(URL url) {
this.addURL(url);
}
}
}