Java的Class对象

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
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
// 空

2.2 Class.forName()

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

  • Example
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
Run static initialization block.

2.3 getClass()

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

  • Example
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
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的反射是另一块内容,本文不涉及。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券