读取内部类值的Java反射
我创建了一个java类,如下所示:读取内部类值的Java反射,java,gson,Java,Gson,我创建了一个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; } } static 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;
}
}
static Class<?> readJson(Class<?> obj) throws Exception {
Gson gson = new Gson();
.....
.....
return gson.fromJson(json, obj.getClass());
}
这个类用于使用Gson读取JSON响应。如下所示:
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;
}
}
static Class<?> readJson(Class<?> obj) throws Exception {
Gson gson = new Gson();
.....
.....
return gson.fromJson(json, obj.getClass());
}
有人能帮我找出哪里出了问题吗?我想您在反射代码中遇到了问题。 您可以从新的“空”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);
我认为您在反射代码中遇到了问题。 您可以从新的“空”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\u 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()
不确定我是否理解这个问题,但让我们用一个更简单的示例来尝试:
class TopNode {
public Child1 c1;
public static class Child1 {
public String s1;
}
}
假设TN\u 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()
是否使用此方法?使用调试器检查TNU配置时是否也获得空值?因为正如i.bondarenko所指出的,你的println是绝对错误的。您正在打印一个新空节点的内容。f.get(new…)
因此您正在从一个新实例获取值,大多数情况下该值必须为null(如果未在构造函数中设置)。是否使用此方法?在使用调试器检查TNU配置时是否也获取null值?因为正如i.bondarenko所指出的,你的println是绝对错误的。您正在打印一个新空节点的内容。f.get(new…)
因此您正在从一个新实例获取值,大多数情况下该值必须为null(如果未在构造函数中设置)很好,我尝试了类似于f.get(TN\u CONFIG.getClass().getDeclaredField(“c1”).getType()
,以及getClass()
的方法,但是获取IllegalArgumentException我的TN_CONFIG对象在加载JSON值后有一些值,如果我尝试像TN_CONFIG.c1.s1
@zeal这样的东西,我可以打印值,为什么不使用像TN_CONFIG.c1.s1
?在我的原始代码中,我现在定义了5个内部类和大约25个字段。所以我想使用反射动态地编写值获取函数。意思是:c1
和s1
可以根据一些参数动态更新。很好的捕获方法我尝试了类似于f.get(TN_CONFIG.getClass().getDeclaredField(“c1”).getType())
,以及getClass()
的方法,但是获取IllegalArgumentException我的TN_CONFIG对象在加载JSON值后有一些值,如果我尝试像TN_CONFIG.c1.s1
@zeal这样的东西,我可以打印值,为什么不使用像TN_CONFIG.c1.s1
?在我的原始代码中,我现在定义了5个内部类和大约25个字段。所以我想使用反射动态地编写值获取函数。含义:c1
和s1
可以根据一些参数动态更新。