反射-获取Class对象的三种方式及区别
1. 获取Class对象
Class对象是反射的核心,通过他可以调用类的任意方法。
1.1 获取Class对象的三种方式:
- 调用某个对象的getClass方法
Person person = new Person();
Class clazz = person.getClass();
- 调用某个类的class属性
Class clazz = Person.class;
- 调用Class类的forName静态方法(最安全性能最好的方法)
Class clazz = Class.forName("com.kevin.base.reflect.Person");
1.2 三种方式的区别
需要被反射的类为:
@Data
public class Person {
private Integer id;
private String name;
private Integer age;
private Integer sex;
static {
System.out.println("执行了静态代码块");
}
{
System.out.println("执行了代码块");
}
}
- 对象的getClass方法获取类的Class对象,因为需要创建对象,所以会执行静态代码块和代码块
public class TestPersonReflect {
public static void main(String[] args) {
Person person = new Person();
Class clazz = person.getClass();
System.out.println("person.getClass()方式:"+clazz.getName());
}
}
执行了静态代码块
执行了代码块
person.getClass()方式:com.kevin.base.reflect.Person
- 类的class属性获取类的Class对象,不会执行静态代码块,也不会执行代码块
public class TestPersonReflect {
public static void main(String[] args) {
Class clazz = Person.class;
System.out.println("Person.class方式:"+clazz.getName());
}
}
Person.class方式:com.kevin.base.reflect.Person
- Class.forName获取类的Class对象,会执行静态代码块,不会执行代码块
public class TestPersonReflect {
public static void main(String[] args) {
Class clazz = null;
try{
clazz = Class.forName("com.kevin.base.reflect.Person");
System.out.println("Class.forName方式:"+clazz.getName());
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
}
执行了静态代码块
Class.forName方式:com.kevin.base.reflect.Person