本文目錄一覽:
- 1、一個java工程在運行的時候怎麼動態載入另一個java工程?
- 2、關於java動態載入jar的問題?
- 3、java可以動態載入一個jar包,並且調用裡面的類和方法嗎?
- 4、java 載入動態鏈接庫怎麼使用相對路徑
一個java工程在運行的時候怎麼動態載入另一個java工程?
直接寫上 new ClassFromPrj2(); 不用你手工「載入」,Java 中載入默認是由 JVM 虛擬器自動完成的,只要引用到的類ClassFromPrj2 在 classpath 中即可。等你達到中級水平,知道 Java Reflection 和 ClassLoader 之後你就知道是怎麼回事了。
我是假設 loadJavaPrj 是第一個工程,假設它使用了第二個工程的類 ClassFromPrj2 的話,那就是
ClassFromPrj2 worker = new ClassFromPrj2();
worker.xxx();
你在運行中需要確保的是:prj2 這個工程的 jar 或 class folder 出現在 java -cp XXX 這個 classpath (-classpath 或 -cp) 參數列表中就可以了。
你在eclipse 項目的 .classpath 文件中發現的東西表明你還是嘗試了解工具的細節,但那個僅僅是 Eclipse 用來幫我們生成命令行參數的配置文件,最終我們需要知道 javac 或 java 這樣的命令行需要什麼參數,這一點一般書上和老師都會講到(但他們一般不會講解Eclipse怎麼工作的)。
關於java動態載入jar的問題?
設我們有一個hello.jar文件,裡面有一個Util類,我們希望在運行期調將這個jar包放入到我們運行環境並且調用裡面的Util.getVersion方法。怎麼實現?
在java中,我們的類都是通過ClassLoader來載入的,同時ClassLoader具有層級關係,當某個類找不到時,它會去他的父類載入器去尋找,如果依然找不到,就拋出ClassNotFoundException了。
為了動態載入hello.jar裡面的Util類,我們需要將這個jar包放入到我們的類載入器中去,然後再獲取裡面的類。如下面的代碼。
// 位於hello.jar
package com.flyingzl;
public class Util {
public static void getVersion(){
System.out.println(“java version: ” + System.getProperty(“java.version”));
}
}
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Main {
public static void main(String[] args) {
URL[] urls = new URL[] {};
MyClassLoader classLoader = new MyClassLoader(urls, null);
try {
classLoader.addJar(new File(“c:/hello.jar”).toURI().toURL());
Class? clazz = classLoader.loadClass(“com.flyingzl.Util”);
Method method = clazz.getDeclaredMethod(“getVersion”);
method.invoke(null);
classLoader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
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);
}
}
}
注意:這裡僅僅是為了展示如何動態載入jar包,代碼寫得很粗,生產代碼需要有更完善的異常處理。我們只關心如何動態載入jar包即可。
動態載入jar包,需要用到java.net.URLClassLoader這個類,它可以指定一個路徑將jar包或者classes文件載入到類空間。載入完畢後,直接調用loadClass就可以載入指定的類,然後通過反射生成實例或者調用方法即可。
其實,Tomcat等伺服器也利用了此思路,比如每一個web應用啟動時,它都會自動載入其下的lib文件夾下的jar包。
運行程序,我們就可以看到程序正常輸出:
java version: 1.7.0_03
java可以動態載入一個jar包,並且調用裡面的類和方法嗎?
可以的
jar可以看成是一個存放很多class的的地方,jar包放入classpath後,其實只要能實現動態的載入類就可以實現題目中的需求了
技術是 java 反射機制,就是一個利用提供類全名而得到這個類實例的機制
通過反射得到Class這個類,然後可以得到關於這個類的方法,欄位等相關信息
具體可以查看相關知識
java 載入動態鏈接庫怎麼使用相對路徑
java 載入動態鏈接庫使用相對路徑一般是不可以直接從jar文件中載入目標dll文件,需要分兩步:
1、從jar中拷貝dll文件
public static void loadJarDll(String name) throws IOException {
InputStream in = MyClass.class.getResourceAsStream(name);
byte[] buffer = new byte[1024];
int read = -1;
File temp = File.createTempFile(name, “”);
FileOutputStream fos = new FileOutputStream(temp);
while((read = in.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
fos.close();
in.close();
System.load(temp.getAbsolutePath());
}
2、創建dll所在的相對路徑,用臨時了路徑過度:
ArrayListString bins = new ArrayListString(){{
add(“/nm/metadata/bin/dependence1.dll”);
add(“/nm/metadata/bin/dependence2.dll”);
add(“/nm/metadata/bin/dependence3.dll”);
add(“/nm/metadata/bin/dependence4.dll”);
add(“/nm/metadata/bin/jniBin.dll”);
}};
new File(new File(System.getProperty(“java.io.tmpdir”)), name)
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/246441.html