Java 具有实际运行时类型的getDeclaredFields,用于不安全的.objectFieldOffset(f)

Java 具有实际运行时类型的getDeclaredFields,用于不安全的.objectFieldOffset(f),java,class,serialization,reflection,Java,Class,Serialization,Reflection,getDeclaredFields[0]。getType()仅返回编译时类信息。我有以下代码,其中java.lang.reflect.Field的类型应为实际类型。此字段被传递到不安全的。objectFieldOffset(f) 即使对象可用于wrapper.field1.getClass(),不安全。objectFieldOffset(f)需要字段实例,因此wrapper.getClass().getDeclaredFields[0]。getType()需要返回SomeClass而不是对象的实

getDeclaredFields[0]。getType()仅返回编译时类信息。我有以下代码,其中
java.lang.reflect.Field
的类型应为实际类型。此字段被传递到不安全的。objectFieldOffset(f)

即使对象可用于wrapper.field1.getClass(),
不安全。objectFieldOffset(f)
需要字段实例,因此
wrapper.getClass().getDeclaredFields[0]。getType()
需要返回SomeClass而不是对象的实际类型。我有没有办法克服这种行为


换言之,是否仍要将不安全的.objectFieldOffset(f)与运行时类型信息一起使用?

很遗憾,这是不可能的
getDeclaredFields()
正是这样做的——返回包含编译时信息的字段。您必须使用
field1.getClass()
检索运行时类型


编辑:您还可以使用
wrapper.getType().getDeclaredFields[0].get(wrapper.getClass())间接检索该类

请参见我的编辑-您可以使用该行间接获取对象的类。如果您没有机会将field1声明为另一种类型,您将没有机会实现您想要的,抱歉。我猜您也不能使用“假”字段
实例,因为序列化库可能会使用它来检索对象本身(通过
Field.get()
)。这是不安全的。objectFieldOffset(f)明显的问题是:为什么首先需要对象字段偏移量。其次,您完全误解了该方法的工作原理,只需将属于
field1
long l=Unsafe.objectFieldOffset(wrapper.getClass().getDeclaredFields()[0]);
)的
字段传递给它,就完成了,不需要获取对象的运行时类型(事实上,这也毫无意义)。就我个人而言,如果可能的话,我会尽量避免使用
不安全的
类。
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());