Java 反射读取内部 class 值
Java Reflection to read inner class values
我创建了一个 java class 如下所示:
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;
}
}
这是 class 用于使用 Gson 读取 JSON 响应。如下所示:
static Class<?> readJson(Class<?> obj) throws Exception {
Gson gson = new Gson();
.....
.....
return gson.fromJson(json, obj.getClass());
}
我正在使用上述方法读取 json 响应并将其存储到对象中。
TN_CONFIG
从这个对象,我试图访问内部 class 字段及其值,但只获得空值。示例:
....
....
Field f = TN_CONFIG.getClass().getDeclaredField("c1")
.getType().getDeclaredField("s1");
System.out.println("S1: " + f.get(new TopNode.Child1());
....
谁能帮我找出哪里出错了?
我认为你的反射代码有问题。
您从 new "empty" 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
的 class 的实例,它本身具有 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
不是嵌套的 class。
,这也应该有效
注2:fieldC1.getType()
可以替换为child1.getClass()
我创建了一个 java class 如下所示:
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;
}
}
这是 class 用于使用 Gson 读取 JSON 响应。如下所示:
static Class<?> readJson(Class<?> obj) throws Exception {
Gson gson = new Gson();
.....
.....
return gson.fromJson(json, obj.getClass());
}
我正在使用上述方法读取 json 响应并将其存储到对象中。
TN_CONFIG
从这个对象,我试图访问内部 class 字段及其值,但只获得空值。示例:
....
....
Field f = TN_CONFIG.getClass().getDeclaredField("c1")
.getType().getDeclaredField("s1");
System.out.println("S1: " + f.get(new TopNode.Child1());
....
谁能帮我找出哪里出错了?
我认为你的反射代码有问题。
您从 new "empty" 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
的 class 的实例,它本身具有 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
不是嵌套的 class。
注2:fieldC1.getType()
可以替换为child1.getClass()