博客参考文章:
http://hw1287789687.iteye.com/blog/1942056 (获取属性名)
https://blog.csdn.net/vipmao/article/details/51638547 (了解Field)
http://www.51gjie.com/java/791.html (Field属性)
- 1、获取集合方法
- 2、获取属性
- 3、获取属性的属性值并修改属性值
- 4、Filed主要方法介绍
获取集合方法(只是针对android)
BAFAppManager.class
private static Stack<Activity> activityStack; //我想获取这个activityStack集合
public Activity currentActivity() {
Activity activity = (Activity)activityStack.lastElement();
return activity;
}
Class APPManager = BAFAppManager.getClass();// 获取集合中的对象类型
try {
Field strField1 = APPManager.getDeclaredField("activityStack");//activityStack是名称
strField1.setAccessible(true);//必须加这个,加了这个才能方位私有变量
Stack<Activity> stackS = (Stack<Activity>) strField1.get(0);//获取到集合了
} catch (NoSuchFieldException e) {
e.printStackTrace();
BAFLogger.e(TAG,e.getMessage());
} catch (IllegalAccessException e) {
e.printStackTrace();
BAFLogger.e(TAG,e.getMessage());
}
getDeclaredFields():只能获取自己声明的各种字段,包括public,protected,private。
Field.setAccessible(true):必须加这个,加了这个才能方位私有变量
获取属性名
person.java
private int id;
private int age;
private String personName;
public String identitify;
protected String address;
String phone;
tea.java
public class tea {
public static void main(String[] args) {
Field[]fields=person.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
}
Class.getDeclaredFields():返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)
field.getName():获取名称
![](https://img.haomeiwen.com/i1945114/929820e62e6a3aae.png)
获取属性的属性值并修改属性值
Test.java
Person person =new Person();
person.setName("VipMao");
person.setAge(24);
person.setSex("男");
for(int i=0;i<3;i++){
person.getList().add("集合"+i);
}
//通过Class.getDeclaredField(String name)获取类或接口的指定属性值。
Field f1=person.getClass().getDeclaredField("name");
System.out.println("-----Class.getDeclaredField(String name)用法-------");
System.out.println(f1.get(person));
Field f4=person.getClass().getDeclaredField("list");
f4.setAccessible(true);
System.out.println((List<String>)f4.get(person));
System.out.println("-----Class.getDeclaredFields()用法-------");
//通过Class.getDeclaredFields()获取类或接口的指定属性值。
Field []f2=person.getClass().getDeclaredFields();
for(Field field:f2)
{
field.setAccessible(true);
System.out.println(field.get(person));
}
//修改属性值
System.out.println("----修改name属性------");
f1.set(person, "Maoge");
//修改后再遍历各属性的值
Field []f3=person.getClass().getDeclaredFields();
for(Field fields:f3)
{
fields.setAccessible(true);
System.out.println(fields.get(person));
}
Person.java
public String name;
private Integer age;
private String sex;
private List<String> list = new ArrayList<String>();
**省略get/set**
fields.setAccessible(true):访问私有变量要改为true,否则会报错
person.getClass().getDeclaredField("name"):获取指定接口名称
person.getClass().getDeclaredFields():返回Field的数组
getFields()和getDeclaredFields():的都是Field对象,获取名称直接field.getName(),但是属性值则是field.get(Object),这个object是该field所属的
![](https://img.haomeiwen.com/i1945114/7642628e73679dd5.png)
Filed主要方法介绍
getType(): 获取属性声明时类型对象(返回class对象)
getGenericType() : 返回属性声的Type类型
getName() : 获取属性声明时名字
getAnnotations() : 获得这个属性上所有的注释
getModifiers() : 获取属性的修饰
isEnumConstant() : 判断这个属性是否是枚举类
isSynthetic() : 判断这个属性是否是 复合类
get(Object obj) : 取得obj对象这个Field上的值
set(Object obj, Object value) : 向obj对象的这个Field设置新值value
setAccessible(true):设置可以访问private权限
。。。。。待后续补充
网友评论