java.lang.Object
--- java.lang.ClassLoader
--- java.security.SecureClassLoader
--- java.net.URLClassLoader
--- sun.misc.Launcher$ExtClassLoader
java.lang.Object
--- java.lang.ClassLoader
--- java.security.SecureClassLoader
--- java.net.URLClassLoader
--- sun.misc.Launcher$AppClassLoader
通常一个类的加载过程是这样的通过当前的类加载器的父加载器尝试查找,如果没有再找其父加载器尝试加载,直到最终的bootstrap classloader为止
public static void main(String[] args) {
ClassLoader cl = getClassLoader();
if (cl == null) {
return;
}
try {
invokeRt(cl, args);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
private static ClassLoader getClassLoader() {
File cfgFile = new File("config.properties");
if (!cfgFile.exists()) {
PrintStream print = new PrintStream(System.out, true);
print.println("Need file: " + cfgFile);
return null;
}
Properties prop = Utils.loadProperties(cfgFile);
if (prop == null) {
return null;
}
List urlList = new LinkedList();
String jarString = prop.getProperty("rtjars");
for (String one : jarString.split(",")) {
String basePath = "/opt";
URL url;
File file = new File(basePath + "/" + one.trim());
try {
url = file.toURI().toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
urlList.add(url);
}
URL[] urlAry = new URL[urlList.size()];
urlAry = (URL[]) urlList.toArray(urlAry);
URLClassLoader loader = new URLClassLoader(urlAry);
return loader;
}
private static void invokeRt(ClassLoader cl, String[] args)
throws Exception {
Class clazz = cl.loadClass("com.angiehawk7.rtool.Main");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("start", String.class);
Object[] methodArgs = { args };
method.invoke(obj, methodArgs);
}