java通过反射获取对象的变量和变量值

在java中如果类的成员变量设置为私有的,一般情况下是不允许直接访问这个变量的,但是有了反射之后,就可以直接获取该变量的名称和变量值

1. 访问成员变量

(1)先定义一个用户实体类
public class User {

    private int id;
    private String name;
    private Date birth;

    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
(2)通过反射获取该类
        /**动态加载类**/
        Class clazz = Class.forName("org.entity.User");
        /**获取类声明的变量**/
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            /**打印变量名**/
            System.out.println(field.getName());
        }

2. 访问成员变量值

(1)第一种方法,直接访问
    public static void print() throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setBirth(sdf.parse("2017-08-16"));
        Class clazz = user.getClass();
        Field[] fs = clazz.getDeclaredFields();
        for (Field field : fs) {
            /**
            如果成员变量是private的,则需要设置accessible为true
            如果成员变量是public的,则不需要设置
            **/
            field.setAccessible(true);
            System.out.println(field.get(user));
        }
    }
(2)第二种方法 调用变量的get方法
public static void print() throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setBirth(sdf.parse("2017-08-16"));
        Class clazz = user.getClass();
        Field[] fs = clazz.getDeclaredFields();
        for (Field field : fs) {
            /** 先获取变量名 **/
            String fieldName = field.getName();
            /**拼接get方法,如getId  **/
            String getMethod = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1,fieldName.length());
            /**
            调用clazz的getMethod方法获取类的指定get方法
            通过invoke执行获取变量值
            **/
            System.out.println(clazz.getMethod(getMethod).invoke(user));
        }
    }
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值