首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java ClassLoader学习1:Launcher源码

2013-12-02 
Java ClassLoader学习一:Launcher源码public class Launcher {private static URLStreamHandlerFactory fa

Java ClassLoader学习一:Launcher源码
public class Launcher { private static URLStreamHandlerFactory factory = new Factory(); private static Launcher launcher = new Launcher(); public static Launcher getLauncher() { return launcher; } private ClassLoader loader; //ClassLoader.getSystemClassLoader会调用此方法 public ClassLoader getClassLoader() { return loader; } public Launcher() { // 1. 创建ExtClassLoader ClassLoader extcl; try { extcl = ExtClassLoader.getExtClassLoader(); } catch (IOException e) { throw new InternalError( "Could not create extension class loader"); } // 2. 用ExtClassLoader作为parent去创建AppClassLoader try { loader = AppClassLoader.getAppClassLoader(extcl); } catch (IOException e) { throw new InternalError( "Could not create application class loader"); } // 3. 设置AppClassLoader为ContextClassLoader Thread.currentThread().setContextClassLoader(loader); //... } static class ExtClassLoader extends URLClassLoader { private File[] dirs; public static ExtClassLoader getExtClassLoader() throws IOException { final File[] dirs = getExtDirs(); return new ExtClassLoader(dirs); } public ExtClassLoader(File[] dirs) throws IOException { super(getExtURLs(dirs), null, factory); this.dirs = dirs; } private static File[] getExtDirs() { String s = System.getProperty("java.ext.dirs"); File[] dirs; //... return dirs; } } /** * The class loader used for loading from java.class.path. * runs in a restricted security context. */ static class AppClassLoader extends URLClassLoader { public static ClassLoader getAppClassLoader(final ClassLoader extcl) throws IOException { final String s = System.getProperty("java.class.path"); final File[] path = (s == null) ? new File[0] : getClassPath(s); URL[] urls = (s == null) ? new URL[0] : pathToURLs(path); return new AppClassLoader(urls, extcl); } AppClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent, factory); } /** * Override loadClass so we can checkPackageAccess. * 这个方法似乎没什么必要,因为super.loadClass(name, resolve)时也会checkPackageAccess */ public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { int i = name.lastIndexOf('.'); if (i != -1) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { // sm.checkPackageAccess(name.substring(0, i)); } } return (super.loadClass(name, resolve)); } }}

?

?

package com.jyz.study.jdk.classLoader;import java.net.URL;import sun.misc.Launcher;/** * 演示 * appClassLoader * extClassloader * bootstrapLoader * 所加载的文件 * @author JoyoungZhang@gmail.com *  */public class ClassLoaderTest {public static void main(String[] args) throws Exception {ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();ClassLoader extClassloader = appClassLoader.getParent();ClassLoader bootstrapLoader  = extClassloader.getParent();System.out.println("the bootstrapLoader : " + bootstrapLoader);System.out.println("the extClassloader : " + extClassloader);System.out.println("the appClassLoader : " + appClassLoader);System.out.println();System.out.println("bootstrapLoader加载以下文件:");URL[] urls = Launcher.getBootstrapClassPath().getURLs();for (int i = 0; i < urls.length; i++) {    System.out.println(urls[i]);}System.out.println();System.out.println("extClassloader加载以下文件:");System.out.println(System.getProperty("java.ext.dirs"));System.out.println();System.out.println("appClassLoader加载以下文件:");System.out.println(System.getProperty("java.class.path"));}}console output:the bootstrapLoader : nullthe extClassloader : sun.misc.Launcher$ExtClassLoader@1c78e57the appClassLoader : sun.misc.Launcher$AppClassLoader@6b97fdbootstrapLoader加载以下文件:file:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/resources.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/rt.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/sunrsasign.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/jsse.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/jce.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/charsets.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/lib/modules/jdk.boot.jarfile:/C:/Program%20Files/Java/jdk1.6.0_27/jre/classesextClassloader加载以下文件:C:\Program Files\Java\jdk1.6.0_27\jre\lib\ext;C:\Windows\Sun\Java\lib\extappClassLoader加载以下文件:E:\GoogleCode\platform-components\trunk\SourceCode\study-jdk\target\classes;E:\GoogleCode\platform-components\trunk\SourceCode\component-core\target\classes;C:\Users\audaque\.m2\repository\junit\junit\3.8.1\junit-3.8.1.jar

?

?

?

热点排行