繁体   English   中英

如何通过反射获取字符串字段值?

[英]How to get a string field value via reflection?

我有此方法返回String类型的Fields对象的列表。

    public static List<Field> getStringFields(Class<?> clazz) {
        List<Field> toReturn = new ArrayList<Field>();

        Field[] allFields = clazz.getDeclaredFields();

        for (Field f : allFields) {
            Class<?> type = f.getType();
            if (type == String.class) {
                stringFields.add(f);
            }
        }

        return stringFields;
    }

这种方法应该使所有字符串字段大写:

public void capitalizeStringFields() {
    List<Field> stringFieldsToCapitalize = Utils.getStringFields(someClass.class);
    try {
        for (Field field : stringFieldsToCapitalize) {
            field.set(this, field.get(this).toString().toUpperCase());
        }
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

问题是:“ field.set(...)”不起作用。 它应该将值大写并将其设置为该字段的新值,但是它不起作用...关于如何解决此问题的任何想法? (PS:在真实代码中,“ someClass.class”被设置为真实类名...)

生成的错误是field.get(this)方法(包括field.set方法)中的IllegalArgumentException。

这可能是很多事情。 如果在执行“获取”或“设置”时遇到异常,则可能是因为该字段是私有的。

你需要做...

field.setAccessible(true)

...在这种情况之前

您似乎还想在与方法所在位置相同的对象上调用“ get”和“ set”,因为您使用了“ this”。

field.set(this, field.get(this).toString().toUpperCase());

(您将收到一个IllegalArgumentException,因为看起来您已经获得了一种类型的字段的字段,并且您试图将它们用于其他类-例如, 是其实例的类)

如果您希望实用程序函数将特定对象的所有String字段都大写,则可以执行以下操作。 不过,在此之前,我建议这不是非常面向对象的,因为通过使用这样的反射,您正在打破OOP的“封装”原理。

class Utils {
    public static List<Field> getStringFields(Class<?> clazz) { ... }

    public static void capitaliseEverythingInADodgyNonOOPWay(Object changeMe) {
        for(Field field : getStringFields(changeMe.getClass())) {
            // Add try catch etc...
            field.setAccessible(true);
            field.set(changeMe, field.get(changeMe).toString().toUpperCase());
        }
    }
}

注意:不适用于目标类中的静态String字段(您可能仍然不想更改这些内容...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM