【问题标题】:How to overwrite classes from jdk?如何从 jdk 覆盖类?
【发布时间】:2011-01-29 17:28:53
【问题描述】:

我正在尝试从开放 jdk 更改一些类,因此我正在创建与开放 jdk 类相同的包结构,并且我正在使用 netbeans 更改类。当我在构建项目时,如果覆盖的类有问题,我会遇到错误。如果成功构建我的项目,应用程序似乎没有考虑我的类的更改,而是使用开放的 jdk 类。知道如何使用我的课程而不是 openjdk 的课程吗?

例子:

如果我在我的项目中创建类 sun.net.www.protocol.https.HttpsURLConnectionImpl 并在其中进行一些更改,我会构建项目,但是当我运行他的应用程序时我的更改不出现,好像用的是openjdk原来的类,不是我的类。

【问题讨论】:

    标签: java classpath bootstrapping openjdk


    【解决方案1】:

    您需要更改引导类路径 java -X 以获取更多信息,这正是您需要的选项。

    -Xbootclasspath/p:

    祝你破解源代码好运!!

    【讨论】:

    • 谢谢,这对我想要实现的目标有所帮助
    • 是的,创建,修复 jdk 中的错误
    【解决方案2】:

    这就是扩展类的用途。

    详情请参阅http://download.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.html#javalauncher。基本上,您要么将 jars 放到 ext 文件夹中,要么在覆盖标准 Java 类的类路径前面使用系统属性指示您想要的内容。

    【讨论】:

    • 所以这意味着如果我的项目中有一个引导类,则加载来自引导的类,而不是来自我的项目的类?
    • 要替换类,我想你需要endorsed 而不是ext。另外,您要更改的不是系统属性,而是要在命令行上设置一个选项。
    • @Tom,可能是,我将它与 Tomcat/Jetty 约定混淆了。
    • 应用服务器等应该从系统类加载器(或子类)加载类。来自ext/扩展类加载器的类应该优先于这些加载。
    • 我总是选择 Xbootclasspath 选项,我们有自己的 java.util.logging 等等。我从不碰 ext(它是为了额外附加到引导程序),因为这可能会弄乱标准应用程序
    【解决方案3】:

    您应该在自己的包中创建您的类,并让使用此类的应用程序导入您的类。因此,您可以在 com.yourdomain 包中创建一个名为 HttpsURLConnectionImpl 的类。

    然后在应用程序代码中确保你导入:

      import com.yourdomain.HttpsURLConnectionImpl;
    

    然后在您的代码中将使用您自己的类。

    【讨论】:

      【解决方案4】:

      如果有人在使用 -Xbootclasspath 选项时遇到问题,我绝对推荐我不久前找到的以下页面: https://github.com/adrianmalik/hotspot-overriding-jdk 。 有一个详细的解释如何使用这个选项和一个好的(和工作的)代码示例。

      【讨论】:

      • 欢迎来到 StackOverflow!虽然答案总是很受欢迎,但请尝试总结您在答案本身中提供的链接中提出的要点。该页面的链接将来可能会中断,这可能是detract from your answer。涵盖链接中关键点的几句话将使您的答案保持正确,即使链接不再有效:​​)
      • 链接确实坏了:/
      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 2021-10-22
      • 2011-11-27
      • 1970-01-01
      • 2012-06-23
      • 2019-12-12
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多