尚学堂百战程序员:Java 反射之Class
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对象:需要类的全名,需抛出异常。常用于加载配置。
查看原文 >>