Java的Class对象

文章作者: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test {

static {
System.out.println("Run static initialization block.");
}

{
System.out.println("Run nonstatic initialization block.");
}
}

public class ClassTest {

/**
* @param args
*/
public static void main(String[] args) {
Class t = Test.class;
}
}
  • Result
1
// 空

2.2 Class.forName()

当执行Class.forName()时,JVM也会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,会对类进行初始化,即执行类的静态代码块。forName()方法中的参数是类名字符串,类名字符串 = 包名 + 类名。Class.forName()的一个很常见的用法是在加载数据库驱动的时候。

  • Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.tyan.test;

public class Test {

static {
System.out.println("Run static initialization block.");
}

{
System.out.println("Run nonstatic initialization block.");
}
}


package com.tyan.test;

public class ClassTest {

/**
* @param args
*/
public static void main(String[] args) {
try {
Class t = Class.forName("com.tyan.test.Test");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
  • Result
1
Run static initialization block.

2.3 getClass()

getClass()方法的方法是在通过的类的实例调用的,即已经创建了类的实例。

  • Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test {

static {
System.out.println("Run static initialization block.");
}

{
System.out.println("Run nonstatic initialization block.");
}
}

public class ClassTest {

public static void main(String[] args) {
Test t = new Test();
Class test = t.getClass();
}
}
  • Result
1
2
Run static initialization block.
Run nonstatic 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的反射是另一块内容,本文不涉及。

如果有收获,可以请我喝杯咖啡!