码迷,mamicode.com
首页 > 编程语言 > 详细

Java类的加载

时间:2018-05-27 16:18:09      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:home   java_home   loader   如何   反射   util   信息   功能   system   

我们每天都能见到太阳,时间长了便习以为常了,不会去思考,太阳光是怎么传来的。但是如果仔细的思考这个问题的话,发现不一定能解释的很清楚。

同理,我们每天用spring框架来开发Java应用,慢慢的掉入了业务开发的深渊,成了springframework 程序员,忘记了Java本质的东西。比方说Java类的加载。

 

1.Java类由谁加载?

Java类的加载是指,将 .class文件加载到虚拟机。加载的工作由ClassLoader以及其子类来完成。

ClassLoader分为,

BootstrapClassLoader       负责加载 java_home/jre/lit/rt.jar

ExtensionClassLoader       负责加载拓展功能的一些jar  java_home/jre/lib/ext/*.jar     对应的类为 :ExtClassLoader

System ClassLoader          负责加载Classpath中的class和jar,                                     对应的类为: AppClassLoader

User-Definde ClassLoader  用户自定义的classloader,比如字节码加密了,自定义calssloader来加载并解密,继承ClassLoader类并重新findClass方法。

2.Java类在什么时候加载?

简单来说就是当我们要使用这个类的时候,他就会加载。

初始化类,反射类,调用一个类的静态方法等

  •  Person p = new Person();
  • Class dog = Class.forName("com.test.Dog");
  • CommonUtil.doSomeThing();

注意,一个Class只会被加载一次,也就是说,只有在第一次调用Person类的方法的时候,因为Person此前没被加载过,所以执行加载,以后调用Person类,就不需要加载了。

3.如何知道JVM加载了哪些类?

要想看Jvm加载了哪些类,可以增加JVM参数,-verbose:class。这样在控制台就有输出。

假设有一个Test类,伪代码如下:

main(){
  Person p = new Person();
  p.sayHello();
  
  Class d =  Class.forName("com.cnblogs.Dog");
  System.out.print(d.getName());
}

 我们在运行类之前给加上-verbose:class参数,那么在控制台我们可以看到出了方法打印的信息,还能看到类加载的信息。

[Loaded com.cnblogs.test.Person from file:/D:/xxx/target/classes/]

并且是先看到类加载信息,然后才看到类执行的方法打印信息。

 

4. 类加载的步骤

类加载的过程分为:  装载  , 链接 , 初始化(非必须)。

装载就是找到二进制的字节码并加载到JVM,JVM通过全限定类名和类加载器完成类的加载。

加载好的类的标识是:类的全限定名 + ClassLoader实例ID。

 

链接的过程中对字节码进行校验。格式是否正确,引用的类,属性是否存在。

(不存在则抛异常,NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError)

 

Java类的加载

标签:home   java_home   loader   如何   反射   util   信息   功能   system   

原文地址:https://www.cnblogs.com/demingblog/p/9096167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!