读取内部类值的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<?&

我创建了一个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<?> 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
可以根据一些参数动态更新。