Java 在不读取类文件的情况下查找类是否具有类初始值设定项

Java 在不读取类文件的情况下查找类是否具有类初始值设定项,java,class,typeinitializer,Java,Class,Typeinitializer,我想知道是否有一种已知的方法可以确定加载的类是否具有类初始值设定项,即是否使用方法编译。我知道这个方法不可见,也不能通过反射调用,但我想在应用一些转换时复制一个加载的类 我希望避免解析类文件,因为我重新定义了此类的所有方法,这实际上意味着我不需要文件中的任何信息,因为所有与我相关的信息都可以从加载的类中获得 因此,我的问题是:是否可以检查加载的类是否存在类初始值设定项?在花了相当多的精力挖掘并在web上阅读后:ClassLoader子系统不会将此信息公开给类表示。任何方法信息都是从已经过滤掉方法

我想知道是否有一种已知的方法可以确定加载的
类是否具有类初始值设定项,即是否使用
方法编译。我知道这个方法不可见,也不能通过反射调用,但我想在应用一些转换时复制一个加载的类

我希望避免解析类文件,因为我重新定义了此类的所有方法,这实际上意味着我不需要文件中的任何信息,因为所有与我相关的信息都可以从加载的
类中获得


因此,我的问题是:是否可以检查加载的
类是否存在类初始值设定项?

在花了相当多的精力挖掘并在web上阅读后:
ClassLoader
子系统不会将此信息公开给
表示。任何方法信息都是从已经过滤掉
方法的本机调用中检索的。在JVM运行时方面,只有内部公开,这可以作为一种非规范的发现方式。对于这个purpse,
ObjectStreamClass
定义了一个静态的私有方法
hasStaticInitializer(Class)
,该方法用于计算隐式序列化UID,该UID由
()V
的UTF值和
修饰符重新设置。仅当类具有类初始值设定项时,才使用static

然而,这种巧合可以用来创建一种不使用内部方法的规范方法:通过手动计算隐式序列ID,可以将该值缩小为两个值,一个值用于具有类初始值设定项的
版本,另一个值用于不具有此类初始值设定项的相同
。然后可以对类文本进行额外序列化,并查看序列化引擎返回的值。如果此值表示由
()V
重新灰化的值,则知道该类定义了这样一个方法。否则,它就没有这样的值