1. 程式人生 > >java動態載入jar包,並執行其中的類和方法

java動態載入jar包,並執行其中的類和方法

動態載入jar包,在實際開發中經常會需要用到,尤其涉及平臺和業務的關係的時候,業務邏輯部分可以獨立出去交給業務方管理,業務方只需要提供jar包,就能在平臺上執行。

下面通過一個例項來直觀演示:

第一:定義一個抽象類 AbstractAction (稍後換成介面的例項)

package com.java.loader;

public abstract class AbstractAction {
	public abstract String action();
}
第二:寫個實體類繼承一下 TestAction
package com.java.jarloader;

import com.java.loader.AbstractAction;

public class TestAction extends AbstractAction{
	public String action() {
		System.out.println("I am working ! ");
		return "this ActionTest class";
	}
}
第三:將TestAction所在的包匯出成jar包的方式,eclipse中直接export即可,放到指定目錄,此處放在
D:\jarload\test.jar

放好後,刪除TestAction檔案和package。

第四:寫個main函式測試下 TestMain (這裡比較無聊,寫了個從檔案讀的方式獲取jar路勁,路徑就是上面提到的jar所在的位置)

package com.java.main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;

import com.java.loader.AbstractAction;
import com.java.loader.AbstractAction;


/**
 * 
 * 兩種方式
 * @author minggang.wumg
 *
 */

public class TestMain {

	public static void main(String[] args) {
		try {
			//第一種  配置成檔案格式
			File file = new File("D:\\jarload\\test.txt");
			BufferedReader in = new BufferedReader(new FileReader(file));
			String s = new String();
			while ((s = in.readLine()) != null) {

				URL url = new URL(s);
				s = null;
				
				URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
						.getContextClassLoader());
				Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>) myClassLoader.loadClass("com.java.jarloader.TestAction");
				AbstractAction action = (AbstractAction) myClass.newInstance();
				String str = action.action();
				System.out.println(str);
				
				//第二種
				URL url1 = new URL("file:D:/jarload/test.jar");
				URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
						.getContextClassLoader());
				Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
				AbstractAction action1 = (AbstractAction) myClass1.newInstance();
				String str1 = action1.action();
				System.out.println(str1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

第五:執行結果:


這是能完成執行的!

下面我們來改寫下:

第一:將抽象類改成介面的形式  InterfaceAction 

package com.java.loader;

public interface InterfaceAction {
	public String action();
}
第二:改寫下實體類,實現介面 TestAction
package com.java.jarloader;

import com.java.loader.InterfaceAction;

public class TestAction implements InterfaceAction{

	@Override
	public String action() {
		System.out.println("I am working ! ");
		return "this ActionTest class";
	}

}

第三步相同。

第四步:稍作修改 TestMain

package com.java.main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;

import javax.swing.AbstractAction;

import com.java.loader.InterfaceAction;




/**
 * 
 * 兩種方式
 * @author minggang.wumg
 *
 */

public class TestMain {

	public static void main(String[] args) {
		try {
			//第一種  配置成檔案格式
			File file = new File("D:\\jarload\\test.txt");
			BufferedReader in = new BufferedReader(new FileReader(file));
			String s = new String();
			while ((s = in.readLine()) != null) {

				URL url = new URL(s);
				s = null;
				
				URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
						.getContextClassLoader());
				Class<?> myClass = (Class<?>) myClassLoader.loadClass("com.java.jarloader.TestAction");
				InterfaceAction action = (InterfaceAction) myClass.newInstance();
				String str = action.action();
				System.out.println(str);
				
				//第二種
				URL url1 = new URL("file:D:/jarload/test.jar");
				URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
						.getContextClassLoader());
				Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
				InterfaceAction action1 = (InterfaceAction) myClass1.newInstance();
				String str1 = action1.action();
				System.out.println(str1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

第五:執行結果相同。