getDeclaredFields[0]。getType()只返回编译时类信息。我有以下代码,其中java.lang.reflect.Field
的类型应为实际类型。此字段被传递给不安全。objectFieldOffset(f)
public class Wrapper {
public Object field1;
//getters and setters for field1 and constructor
}
class SomeClass {
}
Wrapper wrapper = new Wrapper();
wrapper.field1 = new SomeClass();
System.out.println(wrapper.getClass().getDeclaredFields[0].getType());
即使对象可以使用wrapper.field1.getClass(),Unsafe.objectFieldOffset(f)
也需要Field实例,因此wrapper.getClass().getDeclaredFields[0].getType()
需要返回实际类型SomeClass而不是object。有没有什么我可以推翻这种行为?
换言之,是否有将Unsafe.objectFieldOffset(f)
与运行时类型信息一起使用?
不幸的是,这是不可能的。getDeclaredFields()
正是这样做的——返回带有编译时信息的字段。您必须使用field1.getClass()
检索运行时类型。
编辑:您也可以使用wrapper.getType().getDeclaredFields[0].get(wrapper).getClass();
间接检索类