classloader1
来源:互联网 发布:天猫魔盒怎么安装软件 编辑:程序博客网 时间:2024/06/06 01:58
http://www.blogjava.net/lhulcn618/archive/2006/05/25/48230.htmlClassLoader {属性:classloader Parent }public class SecureClassLoader extends ClassLoaderpublic class URLClassLoader extends SecureClassLoader implements Closeable在package sun.misc下有类public class Launcher{有内部类static class ExtClassLoader extends URLClassLoaderstatic class AppClassLoader extends URLClassLoader}AppClassLoader 的Parent 为ExtClassLoaderExtClassLoader的Parent 为null 不是 顶级的加载器(bootstrap class loader)Bootstrap启动Launcher 再启动AppClassLoader 和ExtClassLoaderthis.getClass.getClassLoader(); // 使用当前类的ClassLoader (当前类是由什么加载器加载的)Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader (得到的Classloader是动态的,谁执行(某个线程),就是那个执行者的Classloader 但可以通过Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader)注意:[this.getClass.getClassLoader(); Thread.currentThread().getContextClassLoader(); 方 法一得到的Classloader是静态的,表明类的载入者是谁;方法二得到的Classloader是动态的,谁执行(某个线程),就是那个执行者的 Classloader。对于单例模式的类,静态类等,载入一次后,这个实例会被很多程序(线程)调用,对于这些类,载入的Classloader和执行 线程的Classloader通常都不同。]ClassLoader.getSystemClassLoader(); // 使 用系统ClassLoader,即系统的入口点所使用的ClassLoader。(注意,system ClassLoader与根 ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader)源码:(ClassLoader中) public static ClassLoader getSystemClassLoader() {initSystemClassLoader();if (scl == null) { return null;}SecurityManager sm = System.getSecurityManager();if (sm != null) { ClassLoader ccl = getCallerClassLoader(); if (ccl != null && ccl != scl && !scl.isAncestor(ccl)) {sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); }}return scl; }private static synchronized void initSystemClassLoader() {if (!sclSet) { if (scl != null)throw new IllegalStateException("recursive invocation"); sun.misc.Launcher l = sun.misc.Launcher.getLauncher(); if (l != null) {Throwable oops = null;scl = l.getClassLoader(); try { PrivilegedExceptionAction a; a = new SystemClassLoaderAction(scl); scl = (ClassLoader) AccessController.doPrivileged(a); } catch (PrivilegedActionException pae) { oops = pae.getCause(); if (oops instanceof InvocationTargetException) { oops = oops.getCause(); } }if (oops != null) { if (oops instanceof Error) {throw (Error) oops; } else { // wrap the exception throw new Error(oops); }} } sclSet = true;} }(ClassLoader中内部类)class SystemClassLoaderAction implements PrivilegedExceptionAction { private ClassLoader parent;SystemClassLoaderAction(ClassLoader parent) {this.parent = parent; } public Object run() throws Exception {ClassLoader sys;Constructor ctor;Class c;Class cp[] = { ClassLoader.class };Object params[] = { parent }; String cls = System.getProperty("java.system.class.loader");if (cls == null) { return parent;}c = Class.forName(cls, true, parent);ctor = c.getDeclaredConstructor(cp);sys = (ClassLoader) ctor.newInstance(params);Thread.currentThread().setContextClassLoader(sys);return sys; }}首先获得 父类加载器(ExtClassLoader) sun.misc.Launcher l = sun.misc.Launcher.getLauncher();if (l != null) {scl = l.getClassLoader();//返回AppClassLoader参考sun.misc.Launcher再试图获取[用户希望的系统加载器]System.getProperty("java.system.class.loader");//用户自定义设置的加载器 String cls = System.getProperty("java.system.class.loader");if (cls == null) { return parent;//如果不存在直接返回父类加载器(即:AppClassLoader)}如果存在则:c = Class.forName(cls, true, parent);//用父类(即:AppClassLoader)加载器加载这个classClass cp[] = { ClassLoader.class };Object params[] = { parent };ctor = c.getDeclaredConstructor(cp);sys = (ClassLoader) ctor.newInstance(params);再将生成的class对象传入[父类加载器AppClassLoader]作为参数生成实例对象sys最终返回sys。Thread.currentThread().setContextClassLoader(sys);//此时当前线程的加载器是sys
0 0
- classloader1
- 多线程系列:TheadLocal
- C++ string 中 reverse()、assign()、split()
- WebKit内核学习之三
- Spring配置数据源的三种方式 (dbcp,c3p0,jndi).
- 基于h264的SDP相关字段解析
- classloader1
- inline函数
- flex学习进度6之creationComplete分派
- Spinner的简单功能和用法(下拉选项框)
- 面试题:对1、2、2、3、4、5六个数字进行排列组合
- Linux下文本的高效处理
- classloader2
- ZOJ 3593.One Person Game【扩展欧几里得+逼近】【4月11】
- 程序员遇到Bug时的30个反应