java 反射处理集合_java 反射获取属性/集合学习

1、获取集合方法

2、获取属性

3、获取属性的属性值并修改属性值

4、Filed主要方法介绍获取集合方法(只是针对android)

BAFAppManager.class

private static Stack 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 stackS = (Stack) 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():获取名称

获取属性名称.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)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 list = new ArrayList();

**省略get/set**

fields.setAccessible(true):访问私有变量要改为true,否则会报错

person.getClass().getDeclaredField(“name”):获取指定接口名称

person.getClass().getDeclaredFields():返回Field的数组

getFields()和getDeclaredFields():的都是Field对象,获取名称直接field.getName(),但是属性值则是field.get(Object),这个object是该field所属的

获取属性的属性值并修改属性值.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权限

。。。。。待后续补充


版权声明:本文为weixin_42524750原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。