1. 程式人生 > >JAVA動態載入JAR包

JAVA動態載入JAR包

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

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

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

  1. package com.java.loader;  
  2. publicabstractclass AbstractAction {  
  3.     publicabstract String action();  
  4. }  
第二:寫個實體類繼承一下 TestAction
  1. package com.java.jarloader;  
  2. import com.java.loader.AbstractAction;  
  3. publicclass TestAction extends AbstractAction{  
  4.     public String action() {  
  5.         System.out.println("I am working ! ");  
  6.         return"this ActionTest class";  
  7.     }  
  8. }  
第三:將TestAction所在的包匯出成jar包的方式,eclipse中直接export即可,放到指定目錄,此處放在
  1. D:\jarload\test.jar  

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

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

  1. package com.java.main;  
  2. import java.io.BufferedReader;  
  3. import java.io.File;  
  4. import java.io.FileReader;  
  5. import java.net.URL;  
  6. import java.net.URLClassLoader;  
  7. import com.java.loader.AbstractAction;  
  8. import com.java.loader.AbstractAction;  
  9. /** 
  10.  *  
  11.  * 兩種方式 
  12.  * @author minggang.wumg 
  13.  * 
  14.  */
  15. publicclass TestMain {  
  16.     publicstaticvoid main(String[] args) {  
  17.         try {  
  18.             //第一種  配置成檔案格式
  19.             File file = new File("D:\\jarload\\test.txt");  
  20.             BufferedReader in = new BufferedReader(new FileReader(file));  
  21.             String s = new String();  
  22.             while ((s = in.readLine()) != null) {  
  23.                 URL url = new URL(s);  
  24.                 s = null;  
  25.                 URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()  
  26.                         .getContextClassLoader());  
  27.                 Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>) myClassLoader.loadClass("com.java.jarloader.TestAction");  
  28.                 AbstractAction action = (AbstractAction) myClass.newInstance();  
  29.                 String str = action.action();  
  30.                 System.out.println(str);  
  31.                 //第二種
  32.                 URL url1 = new URL("file:D:/jarload/test.jar");  
  33.                 URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()  
  34.                         .getContextClassLoader());  
  35.                 Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");  
  36.                 AbstractAction action1 = (AbstractAction) myClass1.newInstance();  
  37.                 String str1 = action1.action();  
  38.                 System.out.println(str1);  
  39.             }  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44. }  

第五:執行結果:


這是能完成執行的!

下面我們來改寫下:

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

  1. package com.java.loader;  
  2. publicinterface InterfaceAction {  
  3.     public String action();  
  4. }  
第二:改寫下實體類,實現介面 TestAction
  1. package com.java.jarloader;  
  2. import com.java.loader.InterfaceAction;  
  3. publicclass TestAction implements InterfaceAction{  
  4.     @Override
  5.     public String action() {  
  6.         System.out.println("I am working ! ");  
  7.         return"this ActionTest class";  
  8.     }  
  9. }  

第三步相同。

第四步:稍作修改 TestMain

  1. package com.java.main;  
  2. import java.io.BufferedReader;  
  3. import java.io.File;  
  4. import java.io.FileReader;  
  5. import java.net.URL;  
  6. import java.net.URLClassLoader;  
  7. import javax.swing.AbstractAction;  
  8. import com.java.loader.InterfaceAction;  
  9. /** 
  10.  *  
  11.  * 兩種方式 
  12.  * @author minggang.wumg 
  13.  * 
  14.  */
  15. publicclass TestMain {  
  16.     publicstaticvoid main(String[] args) {  
  17.         try {  
  18.             //第一種  配置成檔案格式
  19.             File file = new File("D:\\jarload\\test.txt");  
  20.             BufferedReader in = new BufferedReader(new FileReader(file));  
  21.             String s = new String();  
  22.             while ((s = in.readLine()) != null) {  
  23.                 URL url = new URL(s);  
  24.                 s = null;  
  25.                 URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()  
  26.                         .getContextClassLoader());  
  27.                 Class<?> myClass = (Class<?>) myClassLoader.loadClass("com.java.jarloader.TestAction");  
  28.                 InterfaceAction action = (InterfaceAction) myClass.newInstance();  
  29.                 String str = action.action();  
  30.                 System.out.println(str);  
  31.                 //第二種
  32.                 URL url1 = new URL("file:D:/jarload/test.jar");  
  33.                 URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()  
  34.                         .getContextClassLoader());  
  35.                 Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");  
  36.                 InterfaceAction action1 = (InterfaceAction) myClass1.newInstance();  
  37.                 String str1 = action1.action();  
  38.                 System.out.println(str1);  
  39.             }  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44. }  

第五:執行結果相同。

相關推薦

JAVA動態載入JAR

動態載入jar包,在實際開發中經常會需要用到,尤其涉及平臺和業務的關係的時候,業務邏輯部分可以獨立出去交給業務方管理,業務方只需要提供jar包,就能在平臺上執行。 下面通過一個例項來直觀演示: 第一:定義一個抽象類 AbstractAction (稍後換成介面的例項)

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

動態載入jar包,在實際開發中經常會需要用到,尤其涉及平臺和業務的關係的時候,業務邏輯部分可以獨立出去交給業務方管理,業務方只需要提供jar包,就能在平臺上執行。 下面通過一個例項來直觀演示: 第一:定義一個抽象類 AbstractAction (稍後換成介面的例項) pa

java程式執行過程中動態載入jar

最近做一個遠端介面測試系統,遇到了動態載入jar包的問題,如將使用者上傳的jar包動態載入後呼叫遠端介面的方法,特將例子記錄下來以便查詢。package cn.baokx.test_addjar; import java.io.File; import java.lang

深入淺出Android動態載入jar技術

在實際專案中,由於某些業務頻繁變更而導致頻繁升級客戶端的弊病會造成較差的使用者體驗,而這也恰是Web App的優勢,於是便衍生了一種思路,將核心的易於變更的業務封裝在jar包裡然後通過網路下載下來,再由android動態載入執行的方案,以改善頻繁升級的毛病   --前言

安卓反射機制動態載入jar

動態載入jar包 BaseDexClassLoader(String dexpath,File dex_optimized_File, String libraryPath,ClassLoader  parent_ClassLoader) DexClassLoader(S

利用classloader動態載入jar

第一種方法: URL url= file.toURI().toURL();//將File型別轉為URL型別,file為jar包路徑 URLClassLoader urlClassLoader=ne

Android動態載入Jar並實現Native方法

一直以來,在Android專案中引用第三方SDK都是將其複製到lib目錄下,根據開發環境的不同進行配置(在Android studio中需要使用工具進行新增File dependency到gradle中),便可直接呼叫內部方法進行實現。 現因公司的需求所以更改了引用Jar包

java動態載入指定的類或者jar反射呼叫其方法-涉及其他jar中的類就報ClassNotFound問題分析及解決思路

       在這篇博文中java動態載入指定的類或者jar包反射呼叫其方法,介紹動態載入指定的類,當時我是拿URLClassLoader介紹的,當然可以自定義一個ClassLoader重寫對應的方

Java實現動態修改Jar內文件內容

文件夾 finall 寫入 prope 某個文件 prop steam hang 修改 import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.uti

Java中一些jar的作用

span 緩存 cxf 6.0 pri tag like servlet license axis.jar SOAP引擎包 commons-discovery-0.2.jar 用來發現、查找和實現可插入式接口,提供一些一般類實例化、單件的生命周期管理的常用方法. j

Java】修改jarclass文件小記

加密 返回 .cn 代碼 要求 ges 命令 文件 定位 今天被瑤瑤要求幫忙了 他現在用的軟件裏有一個bug,因為是外國的開發者,所以要求修改是很麻煩的事。要改的東西很簡單,就是將一個函數裏錯誤的返回值修改。 拿到手的有軟件直接能運行的jar包。 一開始的想法比較簡單,就想

java命令執行jar的方式

運行 -c 必須 loader 自定義 pan ati tcl stat 大家都知道一個java應用項目可以打包成一個jar,當然你必須指定一個擁有main函數的main class作為你這個jar包的程序入口。 具體的方法是修改jar包內目錄META-INF下的MA

Java 讀取Excel2007 jar沖突的問題(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)

cati targe com cat lec 報錯 刪除重復 nta ava 1.jar包沖突報錯問題 2.使用的jar包,以及重復jar包 3.刪除重復jar包 Java 讀取Excel2007 jar包沖突的問題(org.apache.poi.POIXMLExce

JAVA導入jar

引入 .org com 拷貝 bsp onf ges 右擊 rar 新建的java項目,想要引用別的jar包中的方法,需要將.jar文件引入自己的project中。 例如: org.apache.commons.codec.binary.Base64; 1.下載jar包

java中常用jar

中一 2.6 jdb jxl obj 串行化 分析 lean tag commons-io.jar:可以看成是java.io的擴展,用來幫助進行IO功能開發.它包含三個主要的領域:Utilityclasses-提供一些靜態方法來完成公共任務.Filters-提供文件過濾器的

java web的jar衝突導致NoSuchMethodError報錯

 在測試指令碼編寫和應用部署時,經常遇到的一 個問題是:java.lang.NoSuchMethodError。這個問題產生的根本原因是執行時應用載入的jar包版本不是應用程式碼真正需要的版本。要解決這個問題,就要讓應用載入真正“HasSuchMethod"的類所在的jar包。解

檔案在Java工程和 jar統一處理

default.ini配置檔案,希望在程式碼開發過程中和打成jar包釋出過程中都能夠讀取到。 File file = new File("default.ini"); InputStream fis;

Java 獲取當前jar執行的路徑

1.應用根據需求來,直接上程式碼 //獲取當前jar 的執行路徑 ApplicationHome home = new ApplicationHome(getClass()); File jarFile = home.getSource();

Hbase的極限測試經驗之java專案的jar匯入

Hbase的極限測試的內容是把之前編過的網站的後臺資料庫改成hbase即可。 我很快就在hbase資料庫中建完表,也把關於操作資料庫的函式寫好了。 當我除錯時,發現在jsp中的操作資料庫的函式都不能用。 提示我與沒有找到與hbase的類,可是我當時已經通過Build Path的方式把與Hbase有關的所

C#調用java類、jar方法

需要 引用 form style 所有 wing .data part system 一、將已經編譯後的java中Class文件進行打包;打包命令JAR 如:將某目錄下的所有class文件夾全部進行打包處理; 使用的命令:jar cvf test.jar -C com/ .