一、基本概念
(1)Class对象
类型信息在运行时如何表示(RTTI),由Class对象的特殊对象完成,Class对象包含与类有关的信息。
类作为程序中的一部分,每个类都有一个Class对象(即,每当编写且编译了一个新类,就会产生一个Class对象,这个对象被保存在一个同名的.class文件中)
简述:
Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short, int, long, float 和 double) 和 void 类型也可表示为 Class 对象。
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。(0)首先要生成Class对象,然后才能实例化 Instance
(1)当创建一个一个类,类加载器会检查这个类的Class对象是否被加载。如果没有加载默认的类加载器就会根据类名查找.class文件(加载字节码过程中会进行检查验证,保证类没有被破坏,保证安全),当某个类的Class对象被载入内存,他就被用来创建这个类的所有对象。
(2)所有的类在对其第一次使用时动态加载到JVM中。
当程序创建第一个对类的静态成员的引用时会加载(证明构造器也是类的静态方法,即使在构造器之前未使用static关键字),使用new操作符创建类的新对象会被当做对类的静态成员的引用。
(3)动态加载:Java程序运行之前并非完全加载,在需要的时候进行加载
(4)Class对象的生成方式如下:
a、Class.forName("类名字符串")
b、类名.class
c、实例对象.getClass()
三、类的生命周期
类的生命周期
在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成。
类的装载是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。 但是同一个类只会被类装载器装载以前
链接就是把二进制数据组装为可以运行的状态。
链接分为校验,准备,解析这3个阶段
校验一般用来确认此二进制文件是否适合当前的JVM(版本),
准备就是为静态成员分配内存空间,。并设置默认值
解析指的是转换常量池中的代码作为直接引用的过程,直到所有的符号引用都可以被运行程序使用(建立完整的对应关系)
完成之后,类型也就完成了初始化,初始化之后类的对象就可以正常使用了,直到一个对象不再使用之后,将被垃圾回收。释放空间。
当没有任何引用指向Class对象时就会被卸载,结束类的生命周期
// 获取该类的类装载器。
getClassLoader()
//如果当前类表示一个数组,则返回表示该数组组件的 Class 对象,否则返回 null。
getComponentType()
//返回当前 Class 对象表示的类的指定的公有构造子对象
getConstructor(Class[])
//返回当前 Class 对象表示的类的所有公有构造子对象数组。
getConstructors()
//返回当前 Class 对象表示的类的指定已说明的一个构造子对象。
getDeclaredConstructor(Class[])
//返回当前 Class 对象表示的类的所有已说明的构造子对象数组。
getDeclaredConstructors()
//返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。
getDeclaredField(String)
//返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。
getDeclaredFields()
//返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。
getDeclaredMethod(String, Class[])
//返回 Class 对象表示的类或接口的所有已说明的方法数组。
getDeclaredMethods()
//返回当前 Class 对象表示的类或接口的指定的公有成员域对象。
getField(String)
//返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。
getFields()
//返回当前对象表示的类或接口实现的接口。
getInterfaces()
//返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。
getMethod(String, Class[])
//返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
getMethods()
//返回该类或接口的 Java 语言修改器代码。
getModifiers()
//返回 Class 对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
getName()
//按指定名查找资源。
getResource(String)
//用给定名查找资源。
getResourceAsStream(String)
//获取类标记。
getSigners()
//如果此对象表示除 Object 外的任一类, 那么返回此对象的父类对象。
getSuperclass()
//如果 Class 对象表示一个数组则返回 true, 否则返回 false。
isArray()
//判定 Class 对象表示的类或接口是否同参数指定的 Class 表示的类或接口相同,或是其父类。
isAssignableFrom(Class)
//此方法是 Java 语言 instanceof 操作的动态等价方法。
isInstance(Object)
//判定指定的 Class 对象是否表示一个接口类型。
isInterface()
//判定指定的 Class 对象是否表示一个 Java 的基类型。
isPrimitive()
//创建类的新实例。
newInstance()
//将对象转换为字符串
toString()