3

我安装了自定义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

为什么 ClassLoader 会在每个对话框实例化时都加载类,而不仅仅是一次?

另一个例子:

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

4

1 回答 1

2

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

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

于 2013-06-08T19:05:26.503 回答