文章作者:Tyan
博客:noahsnail.com | CSDN | 简书
1. Class对象
在Java中有两种对象:Class对象和实例对象,实例对象是类的实例,通常是通过new
关键字构建的。Class对象是JVM生成用来保存对象的类的信息的。Java程序执行之前需要经过编译、加载、链接和初始化这几个阶段,编译阶段会将源码文件编译为.class
字节码文件,编译器同时会在.class
文件中生成Class对象,加载阶段通过JVM内部的类加载机制,将Class对象加载到内存中。在创建对象实例之前,JVM会先检查Class对象是否在内存中存在,如果不存在,则加载Class对象,然后再创建对象实例,如果存在,则直接根据Class对象创建对象实例。JVM中只有一个Class对象,但可以根据Class对象生成多个对象实例。
2. Class对象的获得
2.1 类名.class
当执行类名.class
时,JVM会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,不会对Class对象进行初始化。
- Example
1 | public class Test { |
- Result
1 | // 空 |
2.2 Class.forName()
当执行Class.forName()
时,JVM也会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,会对类进行初始化,即执行类的静态代码块。forName()
方法中的参数是类名字符串,类名字符串 = 包名 + 类名。Class.forName()
的一个很常见的用法是在加载数据库驱动的时候。
- Example
1 | package com.tyan.test; |
- Result
1 | Run static initialization block. |
2.3 getClass()
getClass()
方法的方法是在通过的类的实例调用的,即已经创建了类的实例。
- Example
1 | public class Test { |
- Result
1 | Run static initialization block. |
3. Class类的常用方法
- getName()
一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void名称。
- newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:x.getClass.newInstance()
,创建了一个同x
一样类型的新实例。newInstance()
方法调用默认构造器(无参数构造器)初始化新建对象。
- getClassLoader()
返回该类的类加载器。
- getComponentType()
返回表示数组组件类型的Class。
- getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的Class。
- isArray()
判定此 Class 对象是否表示一个数组类。
4. 反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Class对象的获得是Java反射的基础,Java的反射是另一块内容,本文不涉及。