java.lang.Objectjava
--- java.lang.ClassLoader
--- java.security.SecureClassLoader
--- java.net.URLClassLoader
--- sun.misc.Launcher$ExtClassLoaderbootstrap
java.lang.Objecturl
--- java.lang.ClassLoader
--- java.security.SecureClassLoader
--- java.net.URLClassLoader
--- sun.misc.Launcher$AppClassLoaderspa
一般一個類的加載過程是這樣的經過當前的類加載器的父加載器嘗試查找,若是沒有再找其父加載器嘗試加載,直到最終的bootstrap classloader爲止.net
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); }