在反射的世界里面,看重的不再是一个对象,而是对象身后的组成(类、构造、普通、成员等)
获取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)); } }