1. 程式人生 > >動態載入jar檔案

動態載入jar檔案

<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);
	        }

	    }
	
}
大家有何疑問,大家可以一起探討!