java動態載入jar包,並執行其中的類和方法
阿新 • • 發佈:2019-02-09
動態載入jar包,在實際開發中經常會需要用到,尤其涉及平臺和業務的關係的時候,業務邏輯部分可以獨立出去交給業務方管理,業務方只需要提供jar包,就能在平臺上執行。
下面通過一個例項來直觀演示:
第一:定義一個抽象類 AbstractAction (稍後換成介面的例項)
package com.java.loader;
public abstract class AbstractAction {
public abstract String action();
}
第二:寫個實體類繼承一下 TestAction
第三:將TestAction所在的包匯出成jar包的方式,eclipse中直接export即可,放到指定目錄,此處放在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"; } }
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();
}
}
}
第五:執行結果相同。