三种方法获取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) 编辑 收藏 举报