三种方法获取Class对象的区别

有关反射的内容见   java反射

得到某个类的Class对象有三种方法:

使用“类名.class”取得

Class.forName(String className)

通过该类实例对象的getClass()

三种方法有何不同?

类名.class      不做类的初始化工作,返回类的Class对象。

Class.forName(String className)     做类的静态初始化,返回类的Class对象。

( 如果使用Class.forName(String name, boolean initialize,ClassLoader loader) ,并将initialize的值设为false,则不会进行类的静态初始化)

实例对象的getClass()                对类进行静态初始化、非静态初始化(由于首先使用new得到类的实例对象,实际上是这一步对类进行了初始化)。

如下示例:

定义一个类Apple,使用上述三种方法分别得到Apple类的Class对象

class Apple {

    // 构造器
    public Apple() {
        System.out.println("This is a constructor");
    }

    // 非静态块
    {
        System.out.println("This is a block");
    }

    // 静态块
    static {
        System.out.println("This is a static block");
    }
}

使用“类名.class”

    public static void main(String[] args) throws Exception {

        Class<?> appleClass = Apple.class;
    }

没有任何输出结果。没有对类做初始化。

Class.forName(String className)

    public static void main(String[] args) throws Exception {
        Class.forName("leetcode.Apple");
    }

输出:This is a static block

说明对类Apple进行了静态初始化

通过该类实例对象的getClass()

    public static void main(String[] args) throws Exception {
        Apple apple = new Apple(); // 对类做了初始化
        Class<?> appleClass = apple.getClass();
    }

输出:

This is a static block
This is a block
This is a constructor

对类做初始化的实际是创建类的实例时。

原文地址:https://www.cnblogs.com/deltadeblog/p/9405630.html