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

时间:2013-07-04 03:35:47

标签: java string reflection

我有一个方法:

public void extractStringFromField(Class<?> classToInspect) {
    Field[] allFields = classToInspect.getDeclaredFields();

    for(Field field : allFields) {
        if(field.getType().isAssignableFrom(String.class)) {
            System.out.println("Field name: " + field.getName());

            // How to get the actual value of the string?!?!
            // String strValue = ???
        }
    }
}

当这个运行时,我得到如下输出:

Field name: java.lang.String

现在如何使用反射将实际字符串值提取到strValue

5 个答案:

答案 0 :(得分:34)

看起来您需要引用该类的实例。您可能希望调用get并传入引用,将返回值转换为String。

您可以按如下方式使用get:

String strValue = (String) field.get (objectReference);

答案 1 :(得分:5)

在理想情况下,Class不包含数据。它仅包含有关其实例的结构和行为的信息以及Classes保持您的数据使用的实例。因此,除非您传递任何实例(从实际提取值的位置),否则您的extractStringFromField方法无法提取值。

如果引用的参数名称,您传递的提取值为instance,那么您可以轻松地获得您想要的内容:

String strValue = (String)field.get(instance);

答案 2 :(得分:1)

只是有用的反射字段示例代码:

Field[] fields = InsanceName.getDeclaredFields();
for (Field field : fields) {      //array for fields names

System.out.println("Fields: " + Modifier.toString(field.getModifiers())); // modyfiers
System.out.println("Fields: " + field.getType().getName());  //type var name
System.out.println("Fields: " + field.getName());        //real var name
field.setAccessible(true);                                //var readable
System.out.println("Fields: " + field.get(InsanceName));  //get var values  
System.out.println("Fields: " + field.toString());     //get "String" values
System.out.println("");  //some space for readable code
}

答案 3 :(得分:0)

String strValue = field.getName().toString();

完整代码如下:

public static void extractStringFromField(Class<?> Login) {
    Field[] allFields = Login.getDeclaredFields();

    for(Field field : allFields) {
        String strValue = field.getName().toString();
//          if(field.getType().isAssignableFrom(String.class)) {
            System.out.println("Field name: " + strValue);
        }
    }

答案 4 :(得分:0)

只是有同样的问题。该线程有所帮助。仅供参考,以防其他人偶然发现此线程。我使用StringBuilder类进行了基本上的转换:

StringBuilder builder = new StringBuilder();
builder.append(field.get(object))

具有多个优点。您没有显式转换的变量(顺便说一下,这会导致基本类型int与Integer出现问题),但是如果顺序执行多个字符串操作,效率也会更高。及时的关键代码部分。