使用Java Reflection在运行时获取字段及其值

时间:2014-08-07 08:59:39

标签: java reflection runtime

我试图在运行时获取对象的字段及其值。以下是代码示例:

public static int calculateProfileStrenght(Object inputObj,
            Map<String, Integer> configMap) throws IllegalArgumentException,
            IllegalAccessException {

        int someValue= 0;
        for (Entry<String, Integer> entry : configMap.entrySet()) {
            System.out.println("Key=" + entry.getKey() + ", Value="+ entry.getValue());
            try {
                Field field = inputObj.getClass().getDeclaredField(entry.getKey());
            } catch (NoSuchFieldException e) {
                System.out.println("No such field: "+entry.getKey());
            } 
        }
        return someValue;

    }

如上所示,Map包含键值对,其中键将成为inputObj的字段名称(或变量名称)。我需要从inputObj读取此字段的值。字段的数据类型是String,int,Date等。 inputObj

    public class UserDetails {


        private int userId;
        private String userName;
        private Date joinedDate;
        private Address homeAddress;
        private String description; 

        // getters and setters
}

我无法执行field.getLong或getChar等,因为该方法是通用的,并且不知道inputObj字段的数据类型。

我需要读取for循环中的字段值并应用业务逻辑。这甚至可能吗?我尝试了很多方法,但没有运气。任何引用/指针都表示赞赏。

3 个答案:

答案 0 :(得分:1)

如何在Filed:Object get(Object obj)中使用此方法 此方法返回指定对象上此Field表示的字段的值。

答案 1 :(得分:0)

我错过了field.get(Object)方法。这将解决问题。

答案 2 :(得分:-1)

field.getType()会返回字段的类型(int.classDate.class等)。您可以根据其返回值轻松执行不同的操作。

Class<?> type = field.getType();
if(type == int.class) {
    // load an int
} else if(type == Date.class) {
    // load a Date
} else if(type == String.class) {
    // load a String
}
// etc