您的位置 首页 java

java中如何使用反射访问一个对象的私有成员

在上一篇 我写到了使用反射实现了一个简单的案例,今天呢我教大家如何使用反射获取java对象的中的私有成员。

一、改造原来的实体类

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();

}

}

二、在工具类中添加逻辑

java中如何使用反射访问一个对象的私有成员

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 <T> void invoke(T t) throws Exception {

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);

}

}

}

三、测试获取的结果

java中如何使用反射访问一个对象的私有成员

通过反射可以直接把私有方法动态执行,并且可以动态改变私有成员变量的值,但是一定要记得 设置暴力访问的权限 !。

文章来源:智云一二三科技

文章标题:java中如何使用反射访问一个对象的私有成员

文章地址:https://www.zhihuclub.com/177152.shtml

关于作者: 智云科技

热门文章

网站地图