Java深入 | 对象如何创建&Class对象

一、基本概念

(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对象。 
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

(2)类加载器
为了生成类的对象,运行这个程序的Java虚拟机(JVM)将使用类加载器。
类加载器实际上可以包含一条类加载器链,但是只有一个原声生类加载器(JVM实现的一部分),原生类加载器加载的是所谓的可信类(如 Java API,通常是本地磁盘加载)。在这条加载链中通常不需要额外类加载器,但如果有特殊需求(网络中下载类等),可以挂接额外的类加载器。



二、对象的创建过程

(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() 


你可能感兴趣的:(Java)