Java 具有实际运行时类型的getDeclaredFields,用于不安全的.objectFieldOffset(f)
getDeclaredFields[0]。getType()仅返回编译时类信息。我有以下代码,其中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而不是对象的实
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());