21

我有一个方法:

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将实际字符串值提取到中?

4

5 回答 5

36

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

您可以使用 get 如下:

String strValue = (String) field.get (objectReference);
于 2013-07-04T03:41:49.727 回答
6

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

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

String strValue = (String)field.get(instance);
于 2013-07-04T04:00:57.337 回答
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
}
于 2017-05-22T22:07:02.950 回答
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);
        }
    }
于 2020-03-17T02:50:29.193 回答
0

只是有同样的问题。这个线程有点帮助。如果其他人偶然发现此线程,仅供参考。我基本上使用 StringBuilder 类进行转换:

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

这具有多重优势。您没有显式转换的一种(顺便说一句,这会导致原始类型 int 与 Integer 的问题),但如果您有多个连续的字符串操作,它也会更有效。在时间关键的代码部分。

于 2020-04-14T12:46:01.510 回答