java - 是否可以检查该类是否具有静态 block (通过反射或其他方式)?

标签 java reflection static

是否可以检查该类是否有静态 block ?

例如,要检查类是否具有静态字段,可以通过调用 clazz.getDeclaredFields() 使用反射然后迭代它以找到静态字段。

与静态方法相同 - clazz.getDeclaredMethods()

但是getDeclaredMethods不返回 init 的方法和clinit 。还有其他方法可以检查该类是否具有静态初始化 block 吗?

最佳答案

无法测试 static 是否存在初始化器,因为该信息甚至在字节码级别不可用。在类文件中,可能有一个初始化方法 <clinit> ,其存在可能是由 static 的存在引起的字段初始值设定项,static初始化 block ,或者仅仅是 assert 的存在在该类的某处声明,列出一些可能的原因。当然,原因可能不止一个,包括这里未提及的原因。由于该字节码工件没有语言语义,因此没有反射方法来测试它的存在。

但是,如果一个类没有可变的static字段,没有任何可以由 static 操作的内容初始化器,这可能会区分“新鲜类”和非“新鲜”类状态。虽然初始值设定项可能会产生副作用,但如果没有 static,则这些不会改变类。要更改的字段。但是,如果初始化程序正在操纵其他类的状态,那么无论如何都会遇到初始化顺序依赖性问题。

此外,由于满足某些标准而重新加载单个类,而不重新加载与该类交互的其他类的想法根本行不通,因为这些旧类也将保持原样链接,而不是使用新加载的类版本。

最简单(如果不是唯一)的解决方案是重新加载特定类加载器的所有类,以获得全新的状态。尝试仅选择性地重新加载某些类,只是一种优化尝试,但尝试优化测试环境是没有意义的......

关于java - 是否可以检查该类是否具有静态 block (通过反射或其他方式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44280134/

相关文章:

java - 使用 Datastax java 驱动程序插入列族?

java - 如何使用 Jenkins 从 Nexus 获取 jar 文件?

c# - 通过字符串获取静态类

linux - 如何静态链接一个复杂的程序

c - 函数中的“静态”对象

Java - 打印出数组中出现次数最少的元素

c# - 当您在另一个变量中有名称时如何设置 C# 4 动态对象的属性

c# - 在 IL Emit 中将对象添加到循环列表 - 公共(public)语言运行时检测到无效程序

c++ - 在构造函数之前调用的静态对象和成员方法

java - 使 index.html 成为路径的一部分