美文网首页Android知识
java 反射获取属性/集合学习

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

作者: 一个冬季 | 来源:发表于2018-04-07 13:51 被阅读344次

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

获取属性名称.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所属的

获取属性的属性值并修改属性值.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 反射获取属性/集合学习

    博客参考文章:http://hw1287789687.iteye.com/blog/1942056 (获取属性名)...

  • Java 反射

    1、Java反射获取某个类的全部属性 Java反射获取某个类的全部属性,步骤所用方法如下: forName():返...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 数据库反射

    今天学习到了反射,通过反射获取到类的名字属性方法,同样适用于数据库的数据获取。 Java反射说的是在运行状态中,...

  • java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: 通过反射获...

  • 「转载」Java 反射 Reflection

    一、了解 Java 中的反射 1. 什么是 Java 的反射 Java反射是在程序运行时获取类的函数、属性、父类和...

  • Java反射

    简单总结下什么是Java反射,怎么使用。 Java反射机制 反射就是指JVM运行期,获取指定类所有的属性和方法的一...

  • java面试知识点(四)- java 动态代理

    java 反射 反射是一种机制,提供java 程序在RunTime获取类的元属性信息,创建对象,执行方法,修改权限...

  • 使用反射机制实现javaBean的自动封装

    1 反射 什么是java反射呢?简单的说,对于java中任意一个类,利用反射都可以获取该类中的所有属性和方法,而对...

  • Java-反射机制

    简介:通过获取Java编译后产生的字节码(class格式)文件,使用Java的反射机制从而获取得到该类的所有属性、...

网友评论

    本文标题:java 反射获取属性/集合学习

    本文链接:https://www.haomeiwen.com/subject/alhfhftx.html