JAVA中的ClassLoder

ClassLoder

JVM的机制是自上而下加载,自下而上检查

最开始是由BootStrap ClassLoader加载rt.jar下的文件,也就是java最最核心的部分;然后由Extension ClassLoader加载ext下的文件;再有App ClassLoader加载用户自己的文件。

由于BootStrap ClassLoader是用c++写的,所以在返回该ClassLoader时会返回null。显然,Class为java.lang.Class,是rt.jar中的,由BootStrap ClassLoader加载,所以返回null

类加载器也是Java类,因为Java类的类加载器本身也是要被类加载器加载的,显然必须有第一个类加载器不是Java类,这个正是BootStrap,使用C/C++代码写的,已经封装到JVM内核中了,而ExtClassLoader和AppClassLoader是Java类。


双亲委托机制的类加载方式

如果自己写一个java.lang.String类, 用AppClassLoader去加载的话,根据双亲委托机制,最终会加载到rt.jar里面的java.lang.String类,自己写的这个java.lang.String类根本不会被加载;如果自己写一个ClassLoader去特意加载自己写的java.lang.String类的话,也不会成功,因为AppClassLoader会拒绝加载java.开头的类,在preDefineClass中可以看到

if ((name != null) && name.startsWith("java.")) {
        throw new SecurityException
            ("Prohibited package name: " +
             name.substring(0, name.lastIndexOf('.')));
    }
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 Zhang-Ke
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信