2.8 获取运行时类的完整结构
package refection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; // 获得类的名称 public class Test07 { @SuppressWarnings("all") public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { Class c1 = Class.forName("refection.User"); //获得类的名字 System.out.println(c1.getName()); // 包名 + 类名 System.out.println(c1.getSimpleName()); // 类名 // 获得类的属性 System.out.println("————————————————————————————————————————————"); Field[] fields = c1.getFields(); // 只能找到public属性 System.out.println(fields); System.out.println("—————————————————————————————————————————————"); fields = c1.getDeclaredFields(); //找到全部的属性 for (Field field : fields) { System.out.println(field); } System.out.println("——————————————————————————————————————————————"); // 获得指定属性的值 Field name = c1.getDeclaredField("name"); // getDeclaredField 需要输入一个属性字段 System.out.println(name); System.out.println("——————————————————————————————————————————————"); //获得类的方法 Method []methods = c1.getMethods(); for (Method method : methods) { System.out.println("正常的:" + method); } methods = c1.getDeclaredMethods(); for (Method method : methods) { System.out.println("getDeclaredMethods:" + method); } // 获取指定方法 Method getName = c1.getMethod("getName",null); Method setName = c1.getMethod("setName", String.class); System.out.println(getName); System.out.println(setName); // 获取构造器 Constructor[] constructors = c1.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } Constructor []constructors1 = c1.getDeclaredConstructors(); for (Constructor constructor : constructors1) { System.out.println( "#" + constructor); } Constructor constructor = c1.getDeclaredConstructor(String.class , int.class , int.class); System.out.println("指定:" + constructor); // 指定全参构造 constructor = c1.getDeclaredConstructor(); System.out.println("指定:" + constructor); // 指定无参构造 } }
2.9 动态创建对象执行方法
- 首先需要创建对象
- Class c1 = Class.forName("位置") ;
- 再者运用无参构造或者全参构造创建一个对象
- 无参:newInstance();
- 全参:获取构造器,填入参数
- 通过反射调用普通的方法
- 获取一个方法: invoke("对象" ,"方法的值");
- 获取属性Field
- 解决权限不够的问题:关闭安全属性
- 变量名.setAccessible(true);
- 传入值:属性名.set();
package refection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; // 反射的综合应用 public class Test08 { /** * - 首先需要创建对象 * - Class c1 = Class.forName("位置") ; * - 再者运用无参构造或者全参构造创建一个对象 * - 无参:newInstance(); * - 全参:获取构造器,填入参数 * - 通过反射调用普通的方法 * - 获取一个方法: invoke("对象" ,"方法的值"); * - 获取属性Field * - 解决权限不够的问题:关闭安全属性 * - 变量名.setAccessible(true); * - 传入值:属性名.set(); * */ @SuppressWarnings("all") public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { // 创建对象 Class c1 = Class.forName("refection.User"); // 无参构造 User user = (User)c1.newInstance(); System.out.println(user); // 全参构造 Constructor constructor = c1.getDeclaredConstructor(String.class , int.class , int.class); User user1 = (User)constructor.newInstance("张三" , 1 , 18); System.out.println(user1); // 通过反射调用方法 User user2 = (User)c1.newInstance(); Method setName = c1.getDeclaredMethod("setName", String.class); setName.invoke(user2 , "张三2"); System.out.println(user2.getName()); // 通过反射操作属性 User user3 = (User)c1.newInstance(); Field name = c1.getDeclaredField("name"); name.setAccessible(true); name.set(user3 , "张三3"); System.out.println(user3.getName()); } }