是否可以检查该类是否有静态 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/