三种方法获取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

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

 

posted on 2018-08-02 16:17  Deltadeblog  阅读(565)  评论(0编辑  收藏  举报

导航