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