java - 为什么 JVM 会在每次实例化时一次又一次地加载相同的 (GUI) 类?

标签 java swing jvm classloader uimanager

我安装了自定义 ClassLoader 以在运行时跟踪加载的类,以捕获一些响应不佳的时刻,并且我看到每次创建 JFrame/JDialog 时都会加载一些 GUI 类:

loading: com.sun.java.swing.plaf.windows.WindowsPopupMenuSeparatorUI
loading: com.sun.java.swing.plaf.windows.WindowsTextFieldUI
loading: com.sun.java.swing.plaf.windows.WindowsTextAreaUI
loading: com.sun.java.swing.plaf.windows.WindowsComboBoxUI
loading: com.sun.java.swing.plaf.windows.WindowsPasswordFieldUI

为什么类加载器在每次对话框实例化时加载类,而不是一次?

另一个例子:

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
com.sun.org.apache.xerces.internal.impl.dv.dtd.DTDDVFactoryImpl

我的简单ClassLoader:

public class MyClassLoader extends ClassLoader {

    public MyClassLoader ( ClassLoader parent ) {
        super( parent );
    }

    @Override
    public Class<?> loadClass( String name ) throws ClassNotFoundException {
        System.out.println( "loading: " + name );
        return super.loadClass( name );
    }
}

JVM 参数:-Djava.system.class.loader=mupackage.MyClassLoader

最佳答案

加载 UI 类是 Swing 外观和感觉初始化过程的一部分,请参阅 UIDefaults.getUI(...)了解更多信息

除非它被调用了数百万次,否则 loadClass(...) 不太可能成为您的问题:如果该类已经加载,它将很快返回。尝试使用分析器查明速度下降的原因

关于java - 为什么 JVM 会在每次实例化时一次又一次地加载相同的 (GUI) 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17002695/

相关文章:

java - 如何在 gRPC 服务器中添加全局异常拦截器?

java - 如何配置 Equinox 以使其需要在 bundle 依赖项中声明的可选包

java - 如何确保 JVM 中只有一个类实例?

java - 在同一台机器上运行不同的 jre 版本

java - 热点默认最大堆大小

java - 不兼容的类型 int 需要 string

java - spring boot (webflux) rest Controller 获取远程 IP 地址

java - 如何将 Applet 转换为 JFrame

Java.awt.SystemTray 不能正确显示托盘图标

java - Swing 应用程序使用扫描仪的条码阅读器