簡體   English   中英

獲取未知類字段的值

[英]Get value of unknown class field

我有一堆存儲在List / Array的未知類。 如何從這些類中獲取字段的值?

我應該在f.get()粘貼什么?

for(Class<?> cl : ClassList){
        for(Field f : cl.getFields()){
            try {
                f.setAccessible(true);
                writeln(f.get( <WHAT TO PASTE HERE> ));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

就反射而言,我更願意依賴於具有比標准Java Reflection API更可讀的API的框架。 我用了兩個:

第一個是鏡子 獲取字段值(靜態或實例)如下所示:

獲得靜態字段的價值:

Class clazz;
Object value = new Mirror().on(clazz).get().field("fieldName");

獲取實例字段的值:

Object target;
Object value = new Mirror().on(target).get().field("fieldName");

您還可以傳遞java.lang.reflect.Field而不是fieldName String。

獲得靜態字段的價值:

Field aField;
Class clazz;
Object value = new Mirror().on(clazz).get().field(aField);

FEST-Reflect是另一個很好的庫( FEST流利的斷言非常好,BTW)。

import static org.fest.reflect.core.Reflection.*;

// Retrieves the value of the field "name"
String name = field("name").ofType(String.class).in(person).get();

// Retrieves the value of the field "powers"
List<String> powers = field("powers").ofType(new TypeRef<List<String>>() {})
                                     .in(jedi).get();

// Retrieves the value of the static field "count" in Person.class
int count = field("count").ofType(int.class).in(Person.class).get();


// Retrieves the value of the static field "commonPowers" in Jedi.class
List<String> commmonPowers = field("commonPowers")
                                    .ofType(new TypeRef<List<String>>() {})
                                    .in(Jedi.class).get();

所有示例均取自各自圖書館的文檔。

基於您提供的代碼的一些快速粗略的示例:使用Mirror實現您想要的(如果我理解正確):

for(Class<?> cl : classList){
   Mirror mirror = new Mirror().on(cl);
   for(Field f: mirror.reflectAll().fields()) {
      if(java.lang.reflect.Modifier.isStatic(f.getModifiers()) {
         writeln(mirror.get().field(f));
      }
   }
}

我假設您只想讀取靜態字段。 對於對象列表:

for(Object obj : objectList){
   for(Field f: new Mirror().on(obj.getClass()).reflectAll().fields()) {
       writeln(new Mirror().on(obj).get().field(f));
   }
}

與FEST-Reflect相同:

for(Class<?> cl : classList){
    for(Field f : cl.getFields()){
      if(java.lang.reflect.Modifier.isStatic(f.getModifiers()) {
         writeln(field(f.getName()).ofType(f.getType()).in(cl).get());
      }
    }
}

和:

for(Object obj : objectList){
   for(Field f: obj.getClass().getFields()) {
      if(!java.lang.reflect.Modifier.isStatic(f.getModifiers()) { //not 100% sure if this is required
         writeln(field(f.getName()).ofType(f.getType()).in(obj).get());
      }
   }
}

請注意 ,如果沒有實際的類實例(對象)來讀取它們,則無法讀取實例字段值。

我希望這有幫助。 當然,這些例子可以使用一些重構。

您只指向某個字段的字段,而不指向特定對象中的特定字段,並且您必須有一個對象才能從中獲取字段值。 參數必須是從中提取字段值的對象。 如果對象的類型錯誤,則拋出IllegalArgumentException 所以要小心。 這是一個片段來說明:

Field field = Integer.class.getDeclaredField("value"); // I think that's the field name
int val = field.get(new Integer(8)); // returns 8
int val2 = field.get("Hello"); // throws IllegalArgumentException

暫無
暫無

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

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