我想知道是否有一种已知的方法来判断加载的Class是否有类初始化器,即用<clinit>方法编译。我知道这个方法是不可见的,也不能通过反射调用,但是我想在应用一些转换时复制一个加载的类。
我想避免解析类文件,因为我重新定义了该类的所有方法,这实际上意味着我不需要文件中的任何信息,因为与我相关的所有信息都可以从加载的Class中获得。
因此,我的问题是:是否可以检查已加载的Class是否存在类初始化器?
发布于 2014-08-20 14:17:33
在花了相当多的精力挖掘这个问题并在web上阅读之后:ClassLoader子系统没有将这些信息公开给Class表示。从本机调用中检索任何方法信息,该调用已经过滤掉了<clinit>方法。在JVM运行时方面,只有内部公开,这可以作为一种非规范的方法来查找。对于本实用程序,ObjectStreamClass定义了一个静态的私有方法hasStaticInitializer(Class),该方法用于计算一个隐式序列化UID,该方法仅在类具有类初始化器的情况下被<clinit>()V和Modifier.STATIC的UTF值重新哈希。
但是,这种巧合可以用来创建一种不使用内部方法的规范方法:通过手动计算隐式串行ID,可以将此值缩小到两个值,一个值用于带有类初始化器的Class版本,一个值用于相同的Class值,而不使用此类初始化器。然后可以另外序列化类文字,并查看序列化引擎返回的值。如果这个值表示由<clinit>()V重新哈希的值,那么我们就知道该类定义了这样一个方法。否则,它就没有这样的价值。
https://stackoverflow.com/questions/25305872
复制相似问题