首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出类是否有类初始化器而不读取类文件

找出类是否有类初始化器而不读取类文件
EN

Stack Overflow用户
提问于 2014-08-14 10:29:25
回答 1查看 57关注 0票数 3

我想知道是否有一种已知的方法来判断加载的Class是否有类初始化器,即用<clinit>方法编译。我知道这个方法是不可见的,也不能通过反射调用,但是我想在应用一些转换时复制一个加载的类。

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

因此,我的问题是:是否可以检查已加载的Class是否存在类初始化器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-20 14:17:33

在花了相当多的精力挖掘这个问题并在web上阅读之后:ClassLoader子系统没有将这些信息公开给Class表示。从本机调用中检索任何方法信息,该调用已经过滤掉了<clinit>方法。在JVM运行时方面,只有内部公开,这可以作为一种非规范的方法来查找。对于本实用程序,ObjectStreamClass定义了一个静态的私有方法hasStaticInitializer(Class),该方法用于计算一个隐式序列化UID,该方法仅在类具有类初始化器的情况下被<clinit>()VModifier.STATIC的UTF值重新哈希。

但是,这种巧合可以用来创建一种不使用内部方法的规范方法:通过手动计算隐式串行ID,可以将此值缩小到两个值,一个值用于带有类初始化器的Class版本,一个值用于相同的Class值,而不使用此类初始化器。然后可以另外序列化类文字,并查看序列化引擎返回的值。如果这个值表示由<clinit>()V重新哈希的值,那么我们就知道该类定义了这样一个方法。否则,它就没有这样的价值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25305872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档