動態調用 JAVA CLASS/JAR,不是難事。只是隨便搜索了一下,沒有完整的過程。於是,綜合了一下,寫不個綜合的範例,以便提供參考。 目錄結構:
{CURDIR}/DynamicLoad.java
/{test}
/testLoad.java
testLoad.java 的源碼:
package test;
public class testLoad{
public static String testing(String name){
return "Hello, "+name+"! I am a public static method, I will return a String.";
}
public static void main(String []argv){
System.out.println("------------------------------Begin.");
System.out.println("Hello, dynamac load class testing!");
for(int i=0; i<argv.length; i++)
System.out.println("argv["+(i)+"]="+argv[i]);
System.out.println("------------------------------End.");
}
}
DynamicLoad.java的源碼:
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class DynamicLoad extends URLClassLoader {
public static void main(String[] args) throws Exception {
dyn_load_class();
dyn_load_jar();
}
public static void dyn_load_class() {
File xFile = new File("test"); //指向class所在的目錄
URL xUrl;
try {
xUrl = xFile.toURL();
URLClassLoader ClassLoader = new URLClassLoader(new URL[]{xUrl});
Class cd = ClassLoader.loadClass("test.testLoad"); //class名(飽含包名)
Field[] f = cd.getDeclaredFields();
for (int k = 0; k < f.length; k++) {
System.out.println(f[k]);
}
Method mainMethod = cd.getMethod("main", new Class[]{String[].class});
String params[]={"aa","bb"};
mainMethod.invoke(null, new Object[] {params});//執行 main 方法
System.out.println("/n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void dyn_load_jar() {
DynamicLoad d = new DynamicLoad();
d.addPath("ttest.jar"); //指向 .jar 具體路徑
}
public DynamicLoad() {
super(new URL[0], ClassLoader.getSystemClassLoader());
}
public void addPath(String paths) {
if (paths == null || paths.length() <= 0) {
return;
}
String separator = System.getProperty("path.separator");
String[] pathToAdds = paths.split(separator);
for (int i = 0; i < pathToAdds.length; i++) {
if (pathToAdds[i] != null && pathToAdds[i].length() > 0) {
try {
File pathToAdd = new File(pathToAdds[i]).getCanonicalFile();
addURL(pathToAdd.toURL());
System.out.println(pathToAdd.toURL());
Class c = this.loadClass("test.testLoad"); //class名(飽含包名)
Field[] f = c.getDeclaredFields();
for (int k = 0; k < f.length; k++) {
System.out.println(f[k]);
}
Method mainMethod = c.getMethod("testing", new Class[]{String.class});
String params="小橙子";
String ret=(String)mainMethod.invoke(null, params);//執行方法
System.out.println("test.testLoad.testing() return:"+ret);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
再,還有編譯方法(保存成一下.cmd文件,雙擊即可看到結果):
@ECHO OFF
javac test/*.java
jar cvf ttest.jar ./test/*.class
javac DynamicLoad.java
java DynamicLoad
ECHO.
PAUSE
(完——希望這次的格式不要亂亂的) (格式還是有問題,(1)已經很好的格式,偏偏要加入多一個空行!(2)自行輸入的代碼中的硬回車不會轉換成<br/>)