为什么这段代码会返回"class java.lang.Object"?
Object a = new Object() {
public Object b = new Object(){
public int c;
};
};
System.out.println(a.getClass().getField("b").getType());
Run Code Online (Sandbox Code Playgroud)
为什么内在类型会丢失?我怎样才能反映c场?
编辑:
这个有效(正如在一些答案中指出的那样):
a.getClass().getField("b").get(a) ...
Run Code Online (Sandbox Code Playgroud)
但是我必须调用一个getter,有没有办法用反射元数据反映c?
因为b声明为Object:
public Object b = ...;
Run Code Online (Sandbox Code Playgroud)
变量类型(静态类型)与该变量引用的对象类型(运行时类型)之间存在区别.
Field.getType() 返回该字段的静态类型.
如果要获取该字段引用的对象的运行时类型,则需要访问该对象并对其进行调用getClass()(因为a声明为Object,因此b作为其成员不可见,您必须使用反射来访问它):
System.out.println(
a.getClass().getField("b").get(a).getClass());
Run Code Online (Sandbox Code Playgroud)
更新:如果c不访问包含它的对象实例,则无法反映.这就是为什么这些类型被称为匿名 - 包含c没有名称的类型,因此您不能b将字段声明为该类型的字段.