美文网首页
2019-02-27ClassLoader 温习

2019-02-27ClassLoader 温习

作者: gdlooker | 来源:发表于2019-02-27 09:59 被阅读0次

ClassLoader的具体作用就是将class字节码文件加载到jvm虚拟机中去
但是jvm在启动的时候并不会一次性加载完成 而是需要根据需要去动态加载

第一步 编写Java代码
第二步 通过首先通过编译器 javac xx.java 编译成.class文件
第三步 ClassLoader加载字节码文件到jvm虚拟机 Class.forName("xxx.com.A")

java环境变量
JAVA_HOME
PATH
CLASSPATH

Java的类加载器 主要有3个:
Bootstrap ClassLoader
Extention ClassLoader
AppClass Loader

android里面的类加载器
UrlClassLoader
DexClassLoader
原理分析:
第一步 用户编写Java代码
第二步 编译 (javac xx.java)
第三步 当我们创建new 对象的时候 或者Class.forName('包名+类名') 它的原理
其实是这么做的 首先 创建了一个ClassLoader 对象 (类加载器)
这个时候翻开ClassLoader.java源码 默认构造器 不过这个构造方法是私有的 我们是通过静态方法来获取AppClassLoader实例的, 发现有一个getSystemLoader的方法是获取ClassLoader
然后我们翻开这个源码 我们发现有一个initSystemLoader的方法 代码如下:

   private static synchronized void initSystemClassLoader() {
       if (!sclSet) {  //如果sclSet==false
           if (scl != null)
               throw new IllegalStateException("recursive invocation");
           sun.misc.Launcher l = sun.misc.Launcher.getLauncher(); //首先获取Laucher 这个就是获取外部类Launcher实例,通过这个实例来获取AppClassLoader内部类的实例  
           if (l != null) {
               Throwable oops = null;
               scl = l.getClassLoader();// 原来是在这里获取ClassLoader实例的
               try {
                   scl = AccessController.doPrivileged(
                       new SystemClassLoaderAction(scl));
               } 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;
       }
   }
  
  //然后重点进入Launcher.java这个文件 看看它的默认构造器   (主要是做了委托这件事)

    public Launcher() {
       Launcher.ExtClassLoader var1;
       try {
           var1 = Launcher.ExtClassLoader.getExtClassLoader();
       } catch (IOException var10) {
           throw new InternalError("Could not create extension class loader", var10);
       }

       try {
           this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
       } catch (IOException var9) {
           throw new InternalError("Could not create application class loader", var9);
       }

       Thread.currentThread().setContextClassLoader(this.loader);
       String var2 = System.getProperty("java.security.manager");
       if (var2 != null) {
           SecurityManager var3 = null;
           if (!"".equals(var2) && !"default".equals(var2)) {
               try {
                   var3 = (SecurityManager)this.loader.loadClass(var2).newInstance();
               } catch (IllegalAccessException var5) {
               } catch (InstantiationException var6) {
               } catch (ClassNotFoundException var7) {
               } catch (ClassCastException var8) {
               }
           } else {
               var3 = new SecurityManager();
           }

           if (var3 == null) {
               throw new InternalError("Could not create SecurityManager: " + var2);
           }

           System.setSecurityManager(var3);
       }

相关文章

  • 2019-02-27ClassLoader 温习

    ClassLoader的具体作用就是将class字节码文件加载到jvm虚拟机中去但是jvm在启动的时候并不会一次性...

  • 温习温习再温习

    今天把以前背过的从头到尾重温了一遍,一共60多首,这两个多月以来不间断背诗的成果。 结果发现由于最近疲于应付这阶段...

  • 温习

    ABC理论: 事件到结果,是通过我们的信念价值观促使的。不是他这样做,所以我生气了,是因为我不认同或者不认可,所以...

  • 温习

    作者:刘玲 来源:北海日报 8年前,他和她在一场相亲会上相识,那时她正受前男友骚扰,不胜其烦。他帮忙劝走了那个...

  • 《温习》

    2017年6月9日 聚焦网初五原创 张婷 郑州 分享第七天 准备睡觉,突然想起,日志 分享没写,刚...

  • 温习

    北方用雪 一滴一点 描好你微笑的脸 我用词语 一字一句 温习你的美丽 2014.02.19

  • 温习

    arguments 系统自带的,可以接受函数的参数,是个数组 函数最好带着return ,不要直接写输出,避免参...

  • 温习

    书市邂逅 渡边淳一、村上春树 抚阅墨香 才记起很多年过去 文字留下的印象已不深刻 于是带回家温习 读书是一种习惯 ...

  • 温习

    昨晚随手从书架上抽出此贴,记起在去年临过。如今写来有老友重复之感。

  • 温习

    只有认真 温习过去的失败 才能在以后 避免同样的错误

网友评论

      本文标题:2019-02-27ClassLoader 温习

      本文链接:https://www.haomeiwen.com/subject/ldlxuqtx.html