1

我需要调试 JDK 1.8 类中发生的一些事情。我正在尝试使用此处提到的认可dir 机制,但似乎对我不起作用。这就是我所做的(在 Windows 上):

  1. javax.swing.plaf.basic.BasicListUI将类源代码复制到<JDK_HOME>/jre/lib/endorsed/javax/swing/plaf/basic/
  2. 修改类代码,增加:

    static {
        System.out.println("REPLACED BasicListUI");
    }
    

    我希望这会导致在加载类后立即打印消息。

  3. cd 到<JDK_HOME>/jre/lib/endorsed并运行javac javax/swing/plaf/basic/BasicListUI。这导致在BasicListUI.class与源文件相同的目录中生成文件。

  4. 编写并编译了这个程序:

    import javax.swing.plaf.basic.BasicListUI;
    public class t {
        public static void main(String args[]) {
            System.out.println(System.getProperty("java.endorsed.dirs"));
            System.out.println(BasicListUI.class.getResource("BasicListUI.class"));
        }
    }
    
  5. 执行的程序java t。我没有看到REPLACED BasicListUI消息,程序的输出是:

    C:\Program Files\Java\jdk1.8.0_40\jre\lib\endorsed
    jar:file:/C:/Program%20Files/Java/jdk1.8.0_40/jre/lib/rt.jar!/javax/swing/plaf/basic/BasicListUI.class
    

另外,如果我运行:

$ java -verbose t | grep BasicListUI

输出是:

[Loaded javax.swing.plaf.basic.BasicListUI from C:\Program Files\Java\jdk1.8.0_40\jre\lib\rt.jar] jar:file:/C:/Program%20Files/Java/jdk1.8.0_40/jre/lib/rt.jar!/javax/swing    /plaf/basic/BasicListUI.class

我错过了什么?

4

1 回答 1

1

啊,发现问题了。这些类必须打包在一个 jar 文件中。所以,补充说

  1. jar cvf rt.jar javax/swing/plaf/basic/BasicListUI.class
于 2015-06-23T21:40:27.620 回答