Java_总结二十四(反射机制)
一、反射是什么
--Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
--使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段(属性)Field进行操作
二、实例化Class类对象的三种方法
User.java
package reflection; public class User { private String name; public int age; static int weight; public User(String name, int age,int weight) { super(); this.name = name; this.age = age; this.weight = weight; } public User() { super(); } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } public void eat() { System.out.println("吃"); } public void drink(String type) { System.out.println("喝" + type); } public String sleep() { System.out.println("睡"); return "呵呵"; } private void play() { System.out.println("玩"); } public static void hehe() { System.out.println("heheheheh"); } }
package reflection; public class GetClass { public static void main(String[] args) { Class class1 = null; Class class2 = null; Class class3 = null; try { class1 = Class.forName("reflection.User");//第一种方法,也是最常用的方法 } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } class2 = new User().getClass();//第二种方法 class3 = User.class;//第三种方法 System.out.println(class1.getName()); System.out.println(class2.getName()); System.out.println(class3.getName()); } }
三、通过有参构造实例化对象、无参构造实例化对象
package reflection; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Construction { public static void main(String[] args) { Class class1 = null; try { class1 = Class.forName("reflection.User"); //通过有参构造实例化对象 Constructor constructor = class1.getConstructor(String.class,int.class);//得到有参构造方法 User user = (User) constructor.newInstance("zhang",43); System.out.println(user); //通过无参构造实例化对象 //第一种方式 Constructor constructor2 = class1.getConstructor(null);//得到无参构造方法 User user2 = (User) constructor2.newInstance(null); //第二种方式 User user3 = (User) class1.newInstance(); System.out.println(user2); System.out.println(user3); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
四、反射取得方法
package reflection; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Methods { public static void main(String[] args) { try { Class class1 = Class.forName("reflection.User"); // 得到构造方法 Constructor constructor = class1.getConstructor(null); Object object = constructor.newInstance(null); Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法 Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有) // 得到 无参 无返回值的 方法并且调用 Method method = class1.getMethod("eat", null); // 调用方法的对象 实际参数 method.invoke(object, null);// 是哪个方法被调用 // 调用 有参数 无返回值的方法 Method method2 = class1.getMethod("drink", String.class); method2.invoke(object, "水"); // 有返回值的 Method method3 = class1.getMethod("sleep", null); Object object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值 System.out.println(object2); // 得到静态的方法 Method method4 = class1.getMethod("hehe", null); method4.invoke(null, null);// 静态方法不需要传递对象 直接写null // 私有的 私有的方法 必须用 getDeclaredMethod 才能得到 Method method5 = class1.getDeclaredMethod("play", null); method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限 method5.invoke(object, null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
五、反射取得属性(字段)
package reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; /** * 注解 * * * 反射: 优点: 可以帮助在没有类的情况下创建对象和调用属性和方法 * 使用注解 * 缺点: 可以使用私有的属性和方法,破坏了代码块的安全性 * * */ public class Fields { public static void main(String[] args) { try { Class class1 = Class.forName("reflection.User"); // 得到构造方法 try { Constructor constructor = class1.getConstructor(null); Object object = constructor.newInstance(null); Field[] fields = class1.getFields(); Field[] fields2 = class1.getDeclaredFields(); Field field = class1.getField("age");// 得到指定的属性对象 field.set(object, 5);// 给属性赋值 Object object2 = field.get(object);// 得到属性值 System.out.println(object2); // 调用静态的属性 Field field2 = class1.getDeclaredField("weight"); field2.set(null, 10); Object object3 = field2.get(null); System.out.println(object3); // 私有的属性 Field field3 = class1.getDeclaredField("name"); field3.setAccessible(true);//设置可以访问私有属性的权限 field3.set(object, "小花"); Object object4 = field3.get(object); System.out.println(object4); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }