gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:09 25 4
gpt4 key购买 nike

我想知道是否有一种已知的方法可以查明加载的 Class 是否具有类初始值设定项,即是否使用 <clinit> 方法进行编译。我知道此方法不可见或无法通过反射调用,但我想在应用某些转换时复制加载的类。

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

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

最佳答案

在花费相当多的努力挖掘并在网上阅读之后:ClassLoader子系统不会将此信息公开给 Class表示。从已经过滤掉 <clinit> 的 native 调用中检索任何方法信息方法。在 JVM 运行时方面,只有内部暴露,可以用作非规范的查找方式。对于这个小狗,ObjectStreamClass定义一个静态的私有(private)方法 hasStaticInitializer(Class)用于计算隐式序列化 UID,该 UID 由 <clinit>()V 的 UTF 值重新散列。和 Modifier.STATIC仅当类具有类初始值设定项时。

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

关于java - 在不读取类文件的情况下找出类是否具有类初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25305872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com