标签:jvm classloade 类加载
java的类加载机制分为:Bootstrap class loader、Extensions class loader和System class loader,这些class loader可以加载class文件、jar包、xml配置文件等。前两者和jvm配置有关,而System class loader则可以由程序员自己指定,下面本文将介绍两种System class loader的方式。
这种方法是通过classpath加载类
CLASSPATH=/home/yang/lib/* #如果是加载jar包,必须加上*,或者直接指定jar文件
java org.mypackage.HelloWorld
该方式会将CLASSPATH变量覆盖掉
java -cp /home/yang/lib/* org.mypackage.HelloWorld
如果没有指定CLASSPATH或者-cp,则会把当前工作目录被认作classpath路径
也可以通过程序进行加载,你只需要调用DynamicClassLoader.loadResourceDir()即可,参数可能是文件或者文件夹,这样你就可以将你程序所需要的jar包或者xml配置文件加载进来
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();
}
}
}
标签:jvm classloade 类加载
原文地址:http://blog.csdn.net/jiewuyou/article/details/45057037