java - 如何在使用 java 类之前加载静态初始化?

标签 java static initialization

我需要加载一些类及其各自的静态初始化,例如在工厂方法实现中。

如果我只是使用以下语法引用该类,JVM 不会运行静态初始化部分。实际上,JVM 是否加载了类?

Class<Shape> shapeClass = Shape.class;

Shape s = null;

但是使用 class.forname() 它确实执行静态初始化。 Class.forname("Shape"); 问题是这是否是加载 java 类和静态初始化的唯一方法?或者还有其他方法吗?使用 class.forname() 有明显的性能损失吗?

最佳答案

来自 Class.forName(String className) API:调用此方法相当于:Class.forName(className, true, currentLoader)

第二个参数 = true 表示初始化类,初始化类表示运行静态初始化器

这是一个要检查的测试

package test;

class Test2 {
    static {
        System.out.println("static init");
    }
}

public class Test1 {

    public static void main(String[] args) throws Exception {
        Class.forName("test.Test2");
    }
}

输出

static init

但是如果你用

加载 Test2
Class.forName("test.Test2", false, ClassLoader.getSystemClassLoader());

不会有任何输出。您还可以使用此测试来查看 Test.class.getName() 也没有加载该类。

加载它的最简单方法是添加一个空的静态方法并调用它:

class Test2 {
     public static void load() {
     }
     ...
Test2.load();

关于java - 如何在使用 java 类之前加载静态初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16354027/

相关文章:

variables - `tf.random_normal` 和 `tf.random_normal_initializer` 有什么区别?

java - RxJava Flowable 缓存到单一死锁

java - 使用 Java 将值插入 MySQL 中的单个列

static - 使用WebPy作为静态HTTP内容服务器

java - 每当我调用函数时,静态函数是否会在类中自动调用?

c - 静态变量未被初始化

c++ - 如何在if语句中定义变量和比较值?

Java 抽象字段模式

java - RequestFactory实体的参数: List<OfOtherEntity> is null on client.在服务器上是可以的

dictionary - 在 Typescript 中声明并初始化字典