JAVA反射系列之Field

JAVA反射系列之Field

参考JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

Field类主要是用来辅助获取和操作类的字段

通过Field反射获取类的字段(成员变量)

先来看JDK提供的方法有如下几种:

  • Class.getDeclaredField(String name)
    返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
  • Class.getDeclaredFields()
    返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段
  • Class.getField(String name)
    返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段(不能用于获取私有)
  • Class.getField()
    返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段(不包括私有)

例子说明:
实体类:

package com.silion.slibrary.utils;

/**
 * Created by silion on 2016/9/18.
 */
public class FieldBean {
    private String title;
    private String content;
    public String des;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }
}

测试类:

package com.silion.slibrary.utils;

import java.lang.reflect.Field;

/**
 * Created by silion on 2016/9/18.
 */
public class FieldTest {
    public static void test() {
        FieldBean bean = new FieldBean();
        bean.setTitle("这是标题");
        bean.setContent("这是内容");
        bean.des = "这是描述";
        try {
            Field title = FieldBean.class.getDeclaredField("title");
            System.out.println(title);// private java.lang.String com.silion.slibrary.utils.FieldBean.title
            Field content = FieldBean.class.getDeclaredField("content");
            System.out.println(content);// private java.lang.String com.silion.slibrary.utils.FieldBean.content 
            // 错误方法,getField系列方法只能获取公共字段,会抛出java.lang.NoSuchFieldException: title
            Field error = FieldBean.class.getField("title"); 
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

获取和更改字段值

得到这个Field之后你就可以获取他的值或者设置他的值了
值得注意的是获取私有属性的时候必须先设置Accessible为true,然后才能获取
获取他的值用get类型方法,他针对常见类型提供了对应get方法,这里就不一一列举了
同理设置的时候调用set类型方法,这里也不一一列举了

例子说明:

package com.silion.slibrary.utils;

import java.lang.reflect.Field;

/**
 * Created by silion on 2016/9/18.
 */
public class FieldTest {
    public static void test() {
        FieldBean bean = new FieldBean();
        bean.setTitle("这是标题");
        bean.setContent("这是内容");
        bean.des = "这是描述";
        try {
            Field title = FieldBean.class.getDeclaredField("title");
            System.out.println(title);
            Field content = FieldBean.class.getDeclaredField("content");
            System.out.println(content);

            // 私有变量必须先设置Accessible为true
            content.setAccessible(true);
            // 设置用set类方法
            content.set(bean, "这是修改后的内容");

            Field[] fields = FieldBean.class.getDeclaredFields();
            for (Field field : fields) {
                System.out.println("---------------我是华丽的分界线---------------");
                System.out.println(field);
                System.out.println(field.equals(title));
                // 私有变量必须先设置Accessible为true
                field.setAccessible(true);
                // 获取用get类方法。
                System.out.println(field.get(bean));
            }
            // 错误方法,getField系列方法只能获取公共字段,会抛出java.lang.NoSuchFieldException: title
            Field error = FieldBean.class.getField("title");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

log输出:

com.silion.slibrary.test I/TestRunner: started: testField(com.silion.slibrary.ApplicationTest)
com.silion.slibrary.test I/System.out: private java.lang.String com.silion.slibrary.utils.FieldBean.title
com.silion.slibrary.test I/System.out: private java.lang.String com.silion.slibrary.utils.FieldBean.content
com.silion.slibrary.test I/System.out: ---------------我是华丽的分界线---------------
com.silion.slibrary.test I/System.out: private java.lang.String com.silion.slibrary.utils.FieldBean.content
com.silion.slibrary.test I/System.out: false
com.silion.slibrary.test I/System.out: 这是修改后的内容
com.silion.slibrary.test I/System.out: ---------------我是华丽的分界线---------------
com.silion.slibrary.test I/System.out: public java.lang.String com.silion.slibrary.utils.FieldBean.des
com.silion.slibrary.test I/System.out: false
com.silion.slibrary.test I/System.out: 这是描述
com.silion.slibrary.test I/System.out: ---------------我是华丽的分界线---------------
com.silion.slibrary.test I/System.out: private java.lang.String com.silion.slibrary.utils.FieldBean.title
com.silion.slibrary.test I/System.out: true
com.silion.slibrary.test I/System.out: 这是标题
com.silion.slibrary.test W/System.err: java.lang.NoSuchFieldException: title
com.silion.slibrary.test W/System.err:     at java.lang.Class.getField(Class.java:1144)

Field应用实例:使用Field更改ViewPager Scroller

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值