在上一篇文章我写到了使用反射实现了一个简单的案例,今天呢我教大家如何使用反射获取java对象的中的私有成员。
package pojo; import java.io.Serializable; /** * @Descrption 学生实体类 * @author lizhilun * */ public class Student implements Serializable { private static final long serialVersionUID = 1L; private Integer id;// 主键 private String name;// 姓名 private Integer age;// 年龄 public void eat(String foodName) { System.out.println(name + "吃" + foodName); } //私有方法一个参数 private void say(String words) { System.out.println(name + "说" + words); } //私有方法无参数 private void say() { System.out.println(name + "说" + "----无参数"); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } 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; } public Student(Integer id, String name, Integer age) { super(); this.id = id; this.name = name; this.age = age; } public Student() { super(); } } |
package utils; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * @Descrption 反射工具类 * @author lizhilun * */ public class ReflectionUtils implements Serializable{ private static final long serialVersionUID = 1L; public static if(t!=null) { Class<? extends Object> clasz = t.getClass(); Field[] fields = clasz.getFields();//获取所有的成员变量 for(Field f: fields) { String name = f.getName();//获取字段名称 System.out.println("成员变量名称:》》》"+name); } Method[] methods = clasz.getMethods();//获取所有的公有方法 for (Method method : methods) { String methodName = method.getName();//获取方法名称 System.out.println(methodName); if(methodName!=null&&"eat".equals(methodName)) { method.invoke(t, "蛋炒饭");//动态执行公有方法 } } //获取无入参的方法 getDeclaredMethod中的第一个参数为私有方法名称 第二个参数为入参 Method method = clasz.getDeclaredMethod("say", null); //设置权限暴力访问,不设置此选项会报错 method.setAccessible(true); method.invoke(t);//执行无参数方法 //获取有入参的方法 getDeclaredMethod中的第一个参数为私有方法名称 第二个参数为入参类型的数组 Method m = clasz.getDeclaredMethod("say", String.class); //设置权限暴力访问,不设置此选项会报错 m.setAccessible(true); m.invoke(t,"反射真是个好东西");//执行有参数方法 //获取私有成员变量 Field field = clasz.getDeclaredField("name"); field.setAccessible(true);//设置暴力访问 field.set(t, "林志玲");//从新为变量赋值 Method m2 = clasz.getMethod("getName", null);//获取name的公有方法 Object name = m2.invoke(t); System.out.println(name); } } } |
通过反射可以直接把私有方法动态执行,并且可以动态改变私有成员变量的值,但是一定要记得设置暴力访问的权限!。
留言与评论(共有 0 条评论) “” |