MyInterface intf = (MyInterface) Class.forName(className).newInstance();
Run Code Online (Sandbox Code Playgroud)
我有一段代码,它将使用上面的调用按需创建新接口并调用某个方法.所有的实现类通常都包含许多final static变量和静态初始化代码,我想在其生命周期中只触发一次.
但是因为我正在使用newInstance()调用,所以我认为旧对象得到GCed并且类再次初始化,因此所有静态变量.
为了避免这种情况,我想把它放在一个缓存中,这样这些类就不会再次重构,因此会在它的生命周期内初始化一次.(注意:我的接口是线程安全的).
我应该把它放在一个Hashtable只是查找它还是有更好的方法来处理缓存?
所有的实现类通常都包含许多最终的静态变量和静态初始化代码,我想在它的生命周期中只触发一次.
但是因为我正在使用newInstance()调用,所以我认为旧对象得到GCed并且类再次初始化,因此所有静态变量.
不,这不是真的.静态字段和静态块只运行一次 - 加载类时.因此,重复创建实例不会重新运行它们.此外,他们不会被垃圾收集.因此,您不必担心静态字段被GCed并重复重新创建:-).
附加说明:
以上仅适用于仅使用默认类加载器的情况.如果您使用多个类加载器并卸载类加载器,那么它加载的所有类及其静态字段都将符合GC的条件.此外,每个类加载器都存在静态字段,不仅是每个类,因此如果使用不同的类加载器加载相同的类,静态初始化将确实运行多次.但这对你来说可能不是一个问题......
另见这里的讨论: