java的类加载机制分为:Bootstrap class loader、Extensions class loader和System class loader,这些class loader可以加载class文件、jar包、xml配置文件等。前两者和jvm配置有关,而System class loader则可以由程序员自己指定,下面本文将介绍两种System class loader的方式。
通过参数加载
这种方法是通过classpath加载类
指定CLASSPATH变量
代码语言:javascript复制CLASSPATH=/home/yang/lib/* #如果是加载jar包,必须加上*,或者直接指定jar文件
java org.mypackage.HelloWorld
通过-cp(也可以写成-classpath)指定
该方式会将CLASSPATH变量覆盖掉
代码语言:javascript复制java -cp /home/yang/lib/* org.mypackage.HelloWorld
如果没有指定CLASSPATH或者-cp,则会把当前工作目录被认作classpath路径
程序之中加载
也可以通过程序进行加载,你只需要调用DynamicClassLoader.loadResourceDir()即可,参数可能是文件或者文件夹,这样你就可以将你程序所需要的jar包或者xml配置文件加载进来
代码语言:javascript复制import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class DynamicClassLoader {
private static URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
private static Method addURLMethod = initAddMethod();
private static Method initAddMethod() {
Method addURL = null;
try {
addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
addURL.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
return addURL;
}
public static void loadJarFiles(String filePath) {
File file = new File(filePath);
loopFiles(file);
}
private static void loopFiles(File file) {
if (file.isDirectory()) {
File[] childFileArray = file.listFiles();
for (File tmp : childFileArray) {
loopFiles(tmp);
}
} else {
if (file.getAbsolutePath().endsWith(".jar")) {
addURL(file);
}
}
}
public static void loadResourceDir(String filePath) {
File file = new File(filePath);
loopDirs(file);
}
private static void loopDirs(File file) {
if (file.isDirectory()) {
addURL(file);
File[] childFileArray = file.listFiles();
for (File tmp : childFileArray) {
loopDirs(tmp);
}
}
}
private static void addURL(File file) {
try {
addURLMethod.invoke(urlClassLoader, new Object[]{file.toURI().toURL()});
} catch (Exception e) {
e.printStackTrace();
}
}
}
参考
- http://en.wikipedia.org/wiki/Java_Classloader