簡體   English   中英

Java Reflection讀取內部類值

[英]Java Reflection to read inner class values

我創建了一個類似於以下內容的Java類:

public class TopNode {
  public Child1 c1;
  public Child2 c2;

public static class Child1 {
  public String s1;
  public String s2;
  }

public static class Child2 {
  public String s3;
  public String s4;
  }
}

此類用於使用Gson讀取JSON響應。 如下所示:

static Class<?> readJson(Class<?> obj) throws Exception {
Gson gson = new Gson();
.....
.....
return gson.fromJson(json, obj.getClass());
}

我正在使用上述方法讀取json響應並將其存儲到對象中。

TN_CONFIG

從這個對象,我試圖訪問內部類字段及其值,但僅獲取空值。 例:

....
....
Field f = TN_CONFIG.getClass().getDeclaredField("c1")
   .getType().getDeclaredField("s1");
System.out.println("S1: " + f.get(new TopNode.Child1());
....

有人可以幫我找到我要去哪里的地方嗎?

我認為您在反射代碼中有問題。 您從新的“空” f.get(new TopNode.Child1())獲得價值

看一下代碼:

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Child1 c1 = new Child1("value1", "value2");
    TopNode node = new TopNode(c1, new Child2("value3", "value4"));
    Field f = node.getClass().getDeclaredField("c1")
            .getType().getDeclaredField("s1");
    System.out.println("S1: " + f.get(c1));
}

輸出:

S1: value1

更新,您可以嘗試下面的代碼來獲取值:

    Field fieldC1 = TN_CONFIG.getClass().getDeclaredField("c1");
    Object objectC1 = fieldC1.get(TN_CONFIG);
    Field fieldS1 = objectC1.getClass().getDeclaredField("s1");
    Object valueS1 = fieldS1.get(objectC1);
    System.out.println("Value S1 = " +  valueS1);

不知道我是否理解問題,但讓我們嘗試一個更簡單的示例:

class TopNode {
    public Child1 c1;

    public static class Child1 {
        public String s1;
    }
}

假設TN_CONFIG的實例TopNode (或具有其他任何類c1 ,其本身所具有的s1 ),首先我們需要獲得c1例如像

Field fieldC1 = TN_CONFIG.getClass().getDeclaredField("c1");
Object child1 = fieldC1.get(TN_CONFIG);

然后我們可以獲取其中的字段值

Field fieldS1 = fieldC1.getType().getDeclaredField("s1");
Object value = fieldS1.get(child1);

注意:如果Child1不是嵌套類,這也應該起作用。

注意2: fieldC1.getType()可以替換為child1.getClass()

暫無
暫無

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

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