Class对象是没办法用new关键字得到的,因为它是jvm生成用来保存对应类的信息的,换句话说,当我们定义好一个类文件并编译成.class字节码后,编译器同时为我们创建了一个Class对象并将它保存.class文件中。我不知道这样描述是否妥当,因为我也见过某些书上直接把.class文件称之为Class对象。同时在jvm内部有一个类加载机制,即在需要的时候(懒加载)将.class文件和对应的Class对象加载到内存中。总之要有这样一个意识,Person.java文件编译成Person.class的同时也会产生一个对应的Class对象。

一般情况下,Java反射操作都需要首先获取Class对象。获取Class对象的方式有三种。

公有属性class

方法getClass()

Class.forName()

下面是示例代码:

/**

*

Title: Java获取Class对象的三种方式

* @author 韩超 2018/2/24 13:56

*/

public class ReflectClassDemo {

/** log4j */

private static final Logger LOGGER = Logger.getLogger(ReflectClassDemo.class);

/**

*

获取Class对象的三种方式

* @author hanchao

*/

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

LOGGER.info("获取Class对象方式01:类的public属性class");

Class clazz1 = User.class;

LOGGER.info(clazz1);

System.out.println();

LOGGER.info("获取Class对象方式02:类的public方法getClass()");

User user = new User();

Class clazz2 = user.getClass();

LOGGER.info(clazz2);

System.out.println();

LOGGER.info("获取Class对象方法03:Class.forName(需要抛出异常)");

Class clazz3 = Class.forName("pers.hanchao.reflect.common.User");

LOGGER.info(clazz3);

}

}

运行结果:

2018-02-24 13:59:06 INFO ReflectClassDemo:18 - 获取Class对象方式01:类的public属性class

2018-02-24 13:59:06 INFO ReflectClassDemo:20 - class pers.hanchao.reflect.common.User

2018-02-24 13:59:06 INFO ReflectClassDemo:23 - 获取Class对象方式02:类的public方法getClass()

2018-02-24 13:59:06 INFO ReflectClassDemo:26 - class pers.hanchao.reflect.common.User

2018-02-24 13:59:06 INFO ReflectClassDemo:29 - 获取Class对象方法03:Class.forName(需要抛出异常)

2018-02-24 13:59:06 INFO ReflectClassDemo:31 - class pers.hanchao.reflect.common.User

总结:

通过公有属性class获取Class对象:通过类获取,无需创建类对象。

通过方法getClass()获取Class对象:需要类的对象。常用于不知道类名但是能获取对象的情况下。

通过方法Class.forName()获取Class对象:需要类的全名,需抛出异常。常用于加载配置。

查看原文 >>
相关文章