获取Class对象的三种方法
有三种方式可以获取Class对象,但是这三种方式有所区别。
首先准备一个Animal类,用于测试
public class Animal { static { System.out.println("静态代码块"); } { System.out.println("动态代码块"); } }
第一种方法,通过Animal.class获取
public class Main { public static void main(String[] args) { Class<?> clazz = Animal.class; System.out.println("class name:" + clazz.getName()); } }
执行结果:class name:com.foo.Animal
这种方式不会执行类的静态代码块,也不会执行动态代码块。
第二种方法,通过Class.forName()获取
public class Main { public static void main(String[] args) { Class<?> clazz = null; try { clazz = Class.forName("com.foo.Animal"); System.out.println("class name:" + clazz.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
执行结果:
静态代码块 class name:com.foo.Animal
通过名称字符串获取Class对象时,会执行静态代码块,但不会执行动态代码块。
第三种方法,通过对象的getClass()方法获取
public class Main { public static void main(String[] args) { Class<? extends Animal> clazz = new Animal().getClass(); System.out.println("class name:" + clazz.getName()); } }
执行结果:
静态代码块 动态代码块 class name:com.foo.Animal
由于创建了对象,所以静态代码块和动态代码块都执行了。