代码之家  ›  专栏  ›  技术社区  ›  Sunny

java:将类成员变量/值转换为映射反射

  •  1
  • Sunny  · 技术社区  · 8 年前

    我有一个类的实例,我想为它创建一个映射,其中Key作为每个类变量的名称,Value作为该类变量的值?

    我试着用下面的方法,但似乎没用。它不进入if()或else if()部分。地图仍然是空的。

    有人能在这里解决这个问题吗?谢谢

    public class ClassA {
        private String optionOne = "1";
        private Int optionTwo = 2;
    
    }
    
    
            Map<String, String> map = new HashMap<>();
            Map<String, Integer> mapInt = new HashMap<>();
    
            for (Field field : ClassA.class.getFields()) {
                field.setAccessible(true);
                if (field.getType().equals(String.class)){
                    map.put(field.getName(), (String) field.get(object));
                } else if (field.getType().equals(Integer.class)) {
                    mapInt.put(field.getName(), (Integer) field.get(object));
                }
            }
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   zhh    8 年前

    改变 getFields 到 getDeclaredFields 和 Integer.class 到 int.class 自字段 optionTwo 是 int 不 Integer 是的。

    Map<String, String> map = new HashMap<>();
    Map<String, Integer> mapInt = new HashMap<>();
    
    for (Field field : ClassA.class.getDeclaredFields()) {
        field.setAccessible(true);
        if (field.getType().equals(String.class)){
            map.put(field.getName(), (String) field.get(object));
        } else if (field.getType().equals(int.class)) {
            mapInt.put(field.getName(), (Integer) field.get(object));
        }
    }
    
        2
  •  0
  •   Sunny    8 年前

    在@zhh的帮助下,我能够解决以下问题:

    1. classa.class.getDeclaredFields()而不是classa.class.getFields()
    2. integer.type而不是integer.class
     for (Field field : ClassA.class.getDeclaredFields()) {
                    field.setAccessible(true);
                    if (field.getType().equals(String.class)){
                        map.put(field.getName(), (String) field.get(object));
                    } else if (field.getType().equals(Integer.TYPE)) {
                        mapInt.put(field.getName(), (Integer) field.get(object));
                    }
                }