Field:成员变量 操作:
1. 设置值 * void set(Object obj, Object value) 2. 获取值 * get(Object obj) 3. 忽略访问权限修饰符的安全检查 * setAccessible(true):暴力反射示例: 创建一个简单的类Person
public class Person { private String name; private int age; public String a; protected String b; String c; private String d; public Person() { } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", a='" + a + '\'' + ", b='" + b + '\'' + ", c='" + c + '\'' + ", d='" + d + '\'' + '}'; } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void eat(){ System.out.println("eat..."); } public void eat(String food){ System.out.println("eat..." + food); } } public class ReflectDemo02 { public static void main(String[] args) throws Exception { //0获取Personde Class对象 Class personClass = Person.class; /* 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getField(String name) 获取指定名称的 public修饰的成员变量 * Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符 * Field getDeclaredField(String name) */ //Field[] getFields() :获取所有public修饰的成员变量 Field[] fields = personClass.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("--------------------------"); //Field getField(String name) 获取指定名称的 public修饰的成员变量 Field a = personClass.getField("a"); //获取成员变量a的值 Person p = new Person(); Object result = a.get(p); System.out.println(result); //设置a的值 a.set(p,"张三"); System.out.println(p); System.out.println("==================="); //Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符 Field[] declaredFields = personClass.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } //Field getDeclaredField(String name) Field d = personClass.getDeclaredField("d"); //忽略访问权限修饰符的安全检查 d.setAccessible(true);//暴力反射 Object value2 = d.get(p); System.out.println(value2); } }程序演示: Constructor:构造方法 创建对象: T newInstance(Object… initargs)
* 如果使用空参数构造方法创建对象,操作可以简化: * Class对象的newInstance方法示例:
public class ReflectDemo03 { public static void main(String[] args) throws Exception { //0获取Personde Class对象 Class personClass = Person.class; /* 2. 获取构造方法们 * Constructor<?>[] getConstructors() * Constructor<T> getConstructor(类<?>... parameterTypes) * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) * Constructor<?>[] getDeclaredConstructors() */ //Constructor<T> getConstructor(类<?>...parameterTypes) Constructor constructor = personClass.getConstructor(String.class, int.class); System.out.println(constructor); //创建对象 Object person = constructor.newInstance("张三", 22); System.out.println(person); System.out.println("----------------"); Constructor constructor1 = personClass.getConstructor(String.class, int.class); System.out.println(constructor1); //创建对象 Object o = personClass.newInstance(); System.out.println(o); } }程序演示: Method:方法对象 执行方法: Object invoke(Object obj, Object… args)
* 获取方法名称: * String getName:获取方法名获取全类名 * String getName()
示例:
public class ReflectDemo04 { public static void main(String[] args) throws Exception { //0获取Personde Class对象 Class personClass = Person.class; /* 3. 获取成员方法们: * Method[] getMethods() * Method getMethod(String name, 类<?>... parameterTypes) * Method[] getDeclaredMethods() * Method getDeclaredMethod(String name, 类<?>... parameterTypes) */ //获取指定名称的方法 Method eat_meath = personClass.getMethod("eat"); Person p = new Person(); //执行方法 eat_meath.invoke(p); Method eat_method2 = personClass.getMethod("eat", String.class); //执行方法 eat_method2.invoke(p,"饭"); //获取所有public 修饰的方法 Method[] methods = personClass.getMethods(); for (Method method : methods) { System.out.println(method); String name = method.getName(); System.out.println(name); //method.setAccessible(true); } //获取类名 String className = personClass.getName(); System.out.println(className);//domain.Person } }程序演示: