反射Class对象功能Field、Constructor、Method
获取成员变量们代码演示:
package cn.chunzhi.reflect; import cn.chunzhi.domain.Person; import java.lang.reflect.Field; public class Test02ReflectField { public static void main(String[] args) throws Exception { // 1.获取Person的Class对象 Class<Person> personClass = Person.class; /* 获取成员变量们: Field[] getFields() Field getField(String name) Field[] getDeclaredFields() Field getDeclaredFields(String name) */ // Field[] getFields():获取所有public修饰的成员变量 Field[] fields = personClass.getFields(); for (Field field : fields) { System.out.println(field); } // Field getField(String name):获取指定名称的public修饰的成员变量 System.out.println("==============================="); Field a = personClass.getField("a"); // 获取成员变量a的值 Person p = new Person(); Object value = a.get(p); System.out.println(value); // 设置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 getDeclaredFields(String name)d Field d = personClass.getDeclaredField("d"); // 忽略访问权限修饰符的安全检查 d.setAccessible(true); // 暴力反射 Object value02 = d.get(p); System.out.println(value02); } }
获取构造方法们代码演示:
package cn.chunzhi.reflect; import cn.chunzhi.domain.Person; import java.lang.reflect.Constructor; public class Test03ReflectConstructor { public static void main(String[] args) throws Exception { // 1.获取Person的Class对象 Class<Person> personClass = Person.class; /* 获取构造方法们: Constructor<?>[] getConstructors() Constructor<T> getConstructor(类<?>... parameterTypes) Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) Constructor<?>[] getDeclaredConstructor() */ // Constructor<T> getConstructor(类<?>... parameterTypes) // 构造器就是用来创建对象的他的方法就是newInstance,这个方法中的...意思是传递可变参 Constructor<Person> constructor = personClass.getConstructor(String.class, int.class); System.out.println(constructor); // 创建对象 Person p = constructor.newInstance("古力娜扎", 23); System.out.println(p); // Person{name='古力娜扎', age=23, a='null', b='null', c='null', d='null'} // 空参构造 Constructor<Person> constructor02 = personClass.getConstructor(); Person p02 = constructor02.newInstance(); System.out.println(p02); // 空参构造可以简化 Person p03 = personClass.newInstance(); // newInstance在JDK 9已经被getDeclaredConstructor()代替 System.out.println(p03); } }
获取成员方法们、方法对象、获取类名代码演示:
package cn.chunzhi.reflect; import cn.chunzhi.domain.Person; import java.lang.reflect.Method; public class Test04ReflectMethod { public static void main(String[] args) throws Exception{ // 1.获取Person的Class对象 Class<Person> personClass = Person.class; /* 获取成员方法们: Method[] getMethod() Method getMethod(String name, 类<?>... parameterTypes) Method[] getDeclaredMethods() Method getDeclaredMethod(String name, 类<?>... parameterTypes) */ // 获取指定名称的方法,空参 Method eat_method = personClass.getMethod("eat"); Person p = new Person(); // 执行方法 eat_method.invoke(p); // 获取指定名称的方法,有参 Method eat_method02 = personClass.getMethod("eat", String.class); // 执行方法 eat_method02.invoke(p, "饭"); // 获取所有public修饰的方法 System.out.println("============================"); Method[] declaredMethods = personClass.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { /* method:方法对象 执行方法: Object invoke(Object obj, Object... args) 获取方法名称: String getName:获取方法名 */ // 获取方法名 String name = declaredMethod.getName(); System.out.println(declaredMethod + ":方法名" + name); } // 获取类名 String name = personClass.getName(); System.out.println(name); } }