簡體   English   中英

如何通過反射從 Java 字段中獲取字符串值?

[英]How to get string value from a Java field via 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

看起來您需要對類的實例的引用。 您可能希望調用get並傳入引用,將返回值轉換為字符串。

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

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

在理想情況下, Class不保存數據。 它僅保存有關其實例的結構和行為的信息,而Classes實例保存您要使用的數據。 所以你的extractStringFromField方法不能提取值,除非你傳遞任何實例(從它實際提取值的地方)。

如果您傳遞給提取值的引用的參數名稱是instance ,那么您可以輕松獲得您想要的內容,如下所示:

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

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

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
}
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);
        }
    }

剛剛有同樣的問題。 這個線程有點幫助。 僅供參考,如果其他人偶然發現此線程。 我使用 StringBuilder 類進行轉換,所以基本上:

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

這具有多重優勢。 一個你沒有顯式轉換(順便說一下,這會導致原始類型 int 與 Integer 的問題),但如果你有多個字符串操作順序,效率也會更高。 及時關鍵的代碼部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM