Compilation 如何编译jdk本身

Compilation 如何编译jdk本身,compilation,overriding,java,Compilation,Overriding,Java,我想编译jdk本身。我的意思是,我想修改jdk中的String.class以查看系统中创建的字符串对象。有没有办法修改jdk中的类?当我试图通过修改rt.jar来修改源代码时,我得到了错误 java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:394) at java.lang.System.initProperties(Native Method) at

我想编译jdk本身。我的意思是,我想修改jdk中的String.class以查看系统中创建的字符串对象。有没有办法修改jdk中的类?当我试图通过修改rt.jar来修改源代码时,我得到了错误

java.lang.NullPointerException
        at java.util.Hashtable.put(Hashtable.java:394)
        at java.lang.System.initProperties(Native Method)
        at java.lang.System.initializeSystemClass(Unknown Source)

可能存在签名问题。

这看起来不像签名问题。看起来您更改了导致哈希表取消引用空指针的内容。回顾你所做的改变,看看为什么会这样做。回想一下,Java在某些情况下保留对字符串常量的内部引用。我猜你弄坏了其中一个。

这看起来不像是签名问题。看起来您更改了导致哈希表取消引用空指针的内容。回顾你所做的改变,看看为什么会这样做。回想一下,Java在某些情况下保留对字符串常量的内部引用。我猜你弄坏了其中一个

有没有办法修改jdk中的类

您可以从源代码下载、修改和构建Java6的OpenJDK版本。网上有关于如何执行此操作的信息

但要注意,对低级Java类(如
String
)的更改可能会产生非专家难以理解的效果。结果很可能是JVM出现故障,导致
println
printStackTrace()
无法工作

有没有办法修改jdk中的类

您可以从源代码下载、修改和构建Java6的OpenJDK版本。网上有关于如何执行此操作的信息


但要注意,对低级Java类(如
String
)的更改可能会产生非专家难以理解的效果。结果很可能是JVM出现故障,导致
println
printStackTrace()
不起作用。

可能还有另一种方法:下载java.lang.String原始源代码,进行修改并只编译这个类


启动主程序时,请注意加载类:首先加载字符串类,然后加载java运行时类。请参阅和-Xbootclasspath/p选项,以正确的顺序执行此操作。

可能还有另一种方法:下载java.lang.String原始源代码,进行修改并仅编译此类


启动主程序时,请注意加载类:首先加载字符串类,然后加载java运行时类。请参阅和-Xbootclasspath/p选项,以正确的顺序执行此操作。

安装JDK时,您也可以选择安装源代码。这样做。或者单独下载源代码。然后

  • 展开src.zip并获取
    String.java
    文件
  • 在包
    java/lang
    中创建一个包含
    String.java
    的新项目
  • 根据您的需要进行相应的更改
  • 只需编译它
  • 将类放入JDK的引导类路径中。看
  • 运行你的应用程序
java-Xbootclasspath/p:-cp

但是更改JDK可能不是一个好主意,并且由于许可证限制,您不允许发布更改后的JDK(至少不超过1.6版)


是的,你的问题很可能在别的地方。请记住,选择未断开;-)

安装JDK时,您也可以选择安装源代码。这样做。或者单独下载源代码。然后

  • 展开src.zip并获取
    String.java
    文件
  • 在包
    java/lang
    中创建一个包含
    String.java
    的新项目
  • 根据您的需要进行相应的更改
  • 只需编译它
  • 将类放入JDK的引导类路径中。看
  • 运行你的应用程序
java-Xbootclasspath/p:-cp

但是更改JDK可能不是一个好主意,并且由于许可证限制,您不允许发布更改后的JDK(至少不超过1.6版)


是的,你的问题很可能在别的地方。请记住,选择未断开;-)

甚至Sun/Oracle 1.6也有限制。IIRC,IANAL:在JRL下,您可以出于研究目的共享更改。JIUL允许在内部生产系统中使用变更。OpenJKD 6/6-open(早期OpenJDK 7的一个后端口)是带有类路径异常的GLP。我想OpenJKD那时是免费的,但我不知道……甚至Sun/Oracle 1.6也有限制。IIRC,IANAL:在JRL下,您可以出于研究目的共享更改。JIUL允许在内部生产系统中使用变更。OpenJKD 6/6-open(早期OpenJDK 7的一个后端口)是带有类路径异常的GLP。我想OpenJKD那时是免费的,但我不知道。。。