猿问

Java反射读取内部类值

我创建了一个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());

....

有人可以帮我找出我哪里出错了吗?


江户川乱折腾
浏览 120回答 2
2回答

慕尼黑8549860

我认为您的反射代码有问题。您从新的“空”Child1 中获得价值 f.get(new TopNode.Child1())看一下代码:public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {&nbsp; &nbsp; Child1 c1 = new Child1("value1", "value2");&nbsp; &nbsp; TopNode node = new TopNode(c1, new Child2("value3", "value4"));&nbsp; &nbsp; Field f = node.getClass().getDeclaredField("c1")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .getType().getDeclaredField("s1");&nbsp; &nbsp; System.out.println("S1: " + f.get(c1));}输出:S1: value1更新,您可以尝试以下代码来获取值:&nbsp; &nbsp; Field fieldC1 = TN_CONFIG.getClass().getDeclaredField("c1");&nbsp; &nbsp; Object objectC1 = fieldC1.get(TN_CONFIG);&nbsp; &nbsp; Field fieldS1 = objectC1.getClass().getDeclaredField("s1");&nbsp; &nbsp; Object valueS1 = fieldS1.get(objectC1);&nbsp; &nbsp; System.out.println("Value S1 = " +&nbsp; valueS1);

青春有我

不确定我是否理解这个问题,但让我们尝试一个更简单的示例:class TopNode {&nbsp; &nbsp; public Child1 c1;&nbsp; &nbsp; public static class Child1 {&nbsp; &nbsp; &nbsp; &nbsp; public String s1;&nbsp; &nbsp; }}假设是(或任何其他具有 a 且本身具有 a 的类)TN_CONFIG的实例,首先我们需要获取实例,如下所示TopNode c1s1c1Field 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()
随时随地看视频慕课网APP

相关分类

Java
我要回答