在反射的世界里面,看重的不再是一个对象,而是对象身后的组成(类、构造、普通、成员等)
获取Class类对象的三种实例化方式
a) 对象.getClass();
b) 类名.class;
c) Class.forName("类的全名称");
package cn.testReflect;
class Person{
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Test {
public static void main(String[] args) throws Exception {
//方法一
Class<?> class1 = new Person("zhangsan", 18).getClass();
//方法二
Class<?> class2 = Person.class;
//方法三
Class<?> class3 = Class.forName("cn.testReflect.Person");
}
}
Class、Constructor、Method、Field 的常用操作方法以及示例
package cn.testReflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Person {
private String name;
private Integer age;
public Person() {}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
public class Test {
public static void main(String[] args) throws Exception {
//获取Class类对象的三种方法
//方法一
Class<?> class1 = new Person().getClass();
//方法二
Class<?> class2 = Person.class;
//方法三
Class<?> class3 = Class.forName("cn.testReflect.Person");
//通过类对象获取constructor 取得指定参数类型的构造方法对象
Constructor<?> constructor = class1.getConstructor();//
Constructor<?> constructor2 = class2.getConstructor(String.class,Integer.class);
//通过构造对象实例化对象
Object object = constructor2.newInstance("李四",20);
System.out.println(object);
//获取所有构造方法,加Declared可以访问private权限的构造
Constructor<?>[] constructors = class3.getDeclaredConstructors();
for (Constructor<?> cons : constructors) {
System.out.println(cons);
}
//通过反射使用Method类获取方法
Method setNameMethod = class3.getMethod("setName", String.class);
Method getNameMethod = class3.getMethod("getName");
Object object2 = constructor.newInstance();
setNameMethod.invoke(object2, "李青");
System.out.println(getNameMethod.invoke(object2));
//通过反射使用Field类获取属性
Field[] fields = class1.getDeclaredFields(); //获取本类中所有属性,包括private
for (Field field : fields) {
System.out.println(field);
}
//获得指定属性
Field fieldName = class1.getDeclaredField("name");
System.out.println("指定属性name:\n"+fieldName);
//Field的使用 set() get();
fieldName.setAccessible(true); //name属性为私有
fieldName.set(object2, "雷老虎");
System.out.println(fieldName.get(object2));
}
}