java类的加载体系结构和加载过程

虚拟机在运行.class文件的时候 会加载.class文件中的内容到内存中,当.class文件加载到内中后就成了 Class 对象 class对象是反射的基础

Class对象由JVM自动产生,每当一个类被加载时,JVM就自动为其生成一个Class对象,通过Class对象可以获得类的相关信息。
将类信息读到内存中过程,称为类加载

Java在需要使用某个类时,才会将该类进行加载,而不是在程序启动时就加载所有的类。
所谓真正需要是指生成类的对象或类被加载时

1.有6种情况,JVM会加载Class对象

一、使用new关键字创建对象时。
二、通过反射创建对象时。
三、调用某个类的static方法时。
四、调用某个类的static属性时。
五、当初始化某个类的子类时。
六、某个类标明为main() 函数类(启动类) 。

3.如何获取对应的类的 Class对象

1.通过 类名.class 获取对应类的Class对象
说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
2.通过 对象.getClass() 获取对应类的Class对象
说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
3.通过Class.forName(类的路径); 获取对应的Class对象,
说明:装入类,并作类的初始化,返回Class的对象。

2.获得类的基本信息的常用方法:

getName() 获得类名
getPackage() 获得包名
isInterface() 是否为接口
isPrimitive() 是否为基本类型
isArray() 是否为数组
getSuperclass() 获得父类的Class对象

4.类的加载分为三个部分:装载、连接、初始化三个过程。
  1.装载是将类做为二进制流读到内存中;
  2.连接
		    a.验证: 验证class文件的有效性
		    b.初始化默认值: 给类中的静态成员设置 初始化默认值 
		    c.解析: 把类中的符号引用解析 真实引用      比如 调用  对象.test() test就是符号引用  test方法所在内存地址(00XX000) 内存地址				             为真实引用 
  3.初始化是初始化类变量或执行static静态块,并为类对象(Class的实例)分配内存空间。
package 通过class对象获取类的相关信息;

public class Test {
   public static void main(String[] args) {
	 //1.通过 类名.class和获取  类的Class对象
	   Class cls=String.class;
	   System.out.println("----通过类名获取对应的Class对象---");
	   System.out.println(cls.getPackage());//获取类所在的包
	   System.out.println(cls.getName());//获取类的完整名称
	   System.out.println(cls.isInterface());//是否是接口
	   System.out.println(cls.isArray());//是否是数组
	   System.out.println(cls.isPrimitive());//是否为基本数据类型
	   System.out.println(cls.getSuperclass().toString());//获取父类的Class对象
    //通过  对象名.class获取 类的Class对象
	   System.out.println("-----通过对象名获取对应的Class对象-------");
	   Class cls1="abc".getClass();
	   System.out.println(cls1.getPackage());//获取类所在的包
	   System.out.println(cls1.getName());//获取类的完整名称
	   System.out.println(cls1.isInterface());//是否是接口
	   System.out.println(cls1.isArray());//是否是数组
	   System.out.println(cls1.isPrimitive());//是否为基本数据类型
	   System.out.println(cls1.getSuperclass().toString());//获取父类的Class对象
      
	   System.out.println(cls==cls1);//返回的结果为true  得出结论 被同一个类加载器加载  该类的 Class对象 在内存中 只有一份
   }
}

输出结果:

----通过类名获取对应的Class对象---
package java.lang, Java Platform API Specification, version 1.7
java.lang.String
false
false
false
class java.lang.Object
-----通过对象名获取对应的Class对象-------
package java.lang, Java Platform API Specification, version 1.7
java.lang.String
false
false
false
class java.lang.Object
true

每一个类都有一个Class对象 正确
对于类的每个实例都有一个对应的Class对象。 错误
一个类对应一个Class对象(被同一个类加载器加载) 正确
基本数据类型 会被 根 加载器加载 正确
数组也是对象,也有对应的Class实例。 正确
数组对应的类由JVM自动生成。 正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值