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

博客参考文章:
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 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():获取名称

java 反射获取属性/集合学习_第1张图片
获取属性名称.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所属的

java 反射获取属性/集合学习_第2张图片
获取属性的属性值并修改属性值.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权限

。。。。。待后续补充

你可能感兴趣的:(java 反射获取属性/集合学习)