通常应用程序都会有很多依赖包,通常的做法是写脚本,在脚本中把依赖包添加到classpath,然后启动主程序。所以本篇纯属调侃,如何在java程序中实现动态加载一个jar,而之后可以自由的使用jar中的类。以前放在博客园,现搬到CSDN来。
http://www.cnblogs.com/rookieport/articles/1667563.html
比如我们有个demo.Person类
package demo;
public class Person {
private int age;
private String name;
public Person() {
}
public Person(String name, int age) {
this.age = age;
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Person{name: " + this.name + ", age: " + this.age + "}";
}
}
我们把demo.Person编译后打包到person.jar,比如放在E:\training\person.jar
然后我们在调用的主程序中可以通过如下代码动态加载person.jar:
import demo.Person;import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
/**
* 这里演示动态加载一个jar的方法
* 其中 demo.Person 类打包在 E:/Training/person.jar
* 执行的时候只需要在Demo的当前路径执行 java Demo就可以自动装载person.jar
*/
public class Demo {
public static void main(String[] args) {
try {
// 包路径定义
URL urls[] = new URL[ ]{ new File( " E:/Training/person.jar " ).toURL() };
// 获取类装载器,然后用反射方式调用类加载器的addURL方法,把新的jar路径添加进去
URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader. class ;
Method method = sysclass.getDeclaredMethod( " addURL " , new Class[]{URL. class });
method.setAccessible( true );
method.invoke(urlLoader, urls);
Person p = new Person( " Kyle.Zhang " , 33 );
System.out.println(p);
} catch (Exception exp) {
exp.printStackTrace();
}
}
}