【问题标题】:how to load a java class along with static initializations before they are used?java - 如何在使用Java类之前加载它们以及静态初始化?
【发布时间】:2013-05-03 07:51:27
【问题描述】:

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

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

Class<Shape> shapeClass = Shape.class;

Shape s = null;

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

【问题讨论】:

  • +1 我刚刚遇到了一个类似的问题,我还想知道静态初始化程序是否已经在Class<?> 的实例上运行。

标签: java static initialization


【解决方案1】:

来自 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();

【讨论】:

  • 问题是关于 class.forname() 语法的替代方案。
【解决方案2】:

当您加载/解析一个类时,静态初始化程序会按照它们定义的顺序执行。 如何加载它们并不重要,无论是否反射。也就是说,除非您指的是其他类型的初始化?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2023-03-26
    • 2013-08-08
    • 2011-02-04
    • 2018-10-05
    • 2020-12-11
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多