java静态初始化器被调用两次

标签 java classloader urlclassloader static-initializer

static boolean isClassLoaded(String fullname) {
    try {
        Class.forName(fullname, false, Loader.instance().getModClassLoader());
        return true;
    } catch (Exception e) {
        return false;
    }
}

此方法是否有可能触发 fullname 的静态初始化程序? 我对调用两次静态初始化程序有问题。 当我尝试检查是否使用 isClassLoaded 加载类并尝试使用该类时,由于构造函数被调用两次而出现错误。 任何人都知道 Class.forName(fullname, false, Loader.instance().getModClassLoader()); 有什么问题?

最佳答案

第二个参数是一个名为“initialize”的标志。

来自docs :

The class is initialized only if the initialize parameter is true and if it has not been initialized earlier.

因此,如果 initialize 设置为 false,它将不会执行静态初始化程序。

独立示例

package test;

public class Main {

    public static void main(String[] args) throws Exception {
        Class.forName("test.Main$Foo", false, Main.class.getClassLoader());
        System.out.println("blah");
        Class.forName("test.Main$Foo", true, Main.class.getClassLoader());
    }

    static class Foo {
        static {
            System.out.println("Foo static initializer");
        }
    }

}

输出

blah
Foo static initializer

请注意,它总是只打印一次 Foo staticinitializer ,但在这里,它首先打印 blah ,即第一个 Class.forName 调用没有执行静态初始化程序。

关于java静态初始化器被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33040829/

相关文章:

java - Recycler如何查看Data Bind?

java - <= && >= Java/Android 运算符

java - javaagent jar 在 bootclasspath 中的位置

java - 我是否需要创建自定义类加载器来支持新的存档格式?

java - 加载类文件后出现 ClassNotFoundException

java - Groovy 扩展模块方法 - 无方法签名

Javafx 项目不使用 Maven 编译

java - 从对象列表中查找最后一个对象,如果没有找到则抛出异常

java - 使用 javax.tool 进行级联内存编译

java - URLClassLoader 未加载资源