如何编辑Java平台包(内置API)源代码?

如何编辑Java平台包(内置API)源代码?,java,Java,尽管Java API很好,但对于我正在处理的项目,我需要更改默认API包(例如Java.util.Scanner)中某些类的代码 理想情况下,我会扩展我感兴趣的类并创建我自己的子类,但是我想要扩展的类被声明为“final”。你建议我怎么做?如果我自定义这些包的源代码,编译器会有问题吗?不要这样做。编写您自己的代码,将原始扫描仪包装起来并使用它。要更新内部包,您可以在运行时提供一个认可的目录属性。您确实无法扩展最终类 如果你真的想通过扩展一个类来添加功能,你可以通过修改类src来实现。从JDK下载

尽管Java API很好,但对于我正在处理的项目,我需要更改默认API包(例如
Java.util.Scanner
)中某些类的代码


理想情况下,我会扩展我感兴趣的类并创建我自己的子类,但是我想要扩展的类被声明为“final”。你建议我怎么做?如果我自定义这些包的源代码,编译器会有问题吗?

不要这样做。编写您自己的代码,将原始扫描仪包装起来并使用它。要更新内部包,您可以在运行时提供一个
认可的
目录属性。

您确实无法扩展最终类


如果你真的想通过扩展一个类来添加功能,你可以通过修改类src来实现。从JDK下载并将其保存为您自己的类并使用它。

永远不要这样做!永远不要改变核心类。若类是最终使用的组合而不是继承。

若可以,你们应该像另一个答案中所建议的那个样包装和委托。看

但是如果你真的需要的话,当然有办法做到这一点

一种简单的方法是在下载的源代码中修改代码,并在类路径中替换您自己的jar版本

另一种选择是使用面向方面的编程技术,可能需要拦截和修改调用

也可以使用反射和自行开发的类加载器来拼凑出一个解决方案,但编写代码会很痛苦

然而,如果你不知道自己在做什么,所有这些都是相当危险的。通常情况下,课程是有充分理由的


如果您更具体地告诉我们您希望更改的内容,我们可能会提供帮助,以避免您目前认为需要的内容。

您希望在课程中更改什么?我怀疑是否有必要更改API代码…恕我直言,但为什么需要这样做?我这样问,是因为在大多数情况下,当有人提出这样的请求时,有更简单直接的解决方案。@bpgergo除了上面的回答之外,还有各种各样的事情,比如修改构造函数、将void方法的返回类型附加到boolean以监控控制流、将我自己的方法添加到类中等等,我认为无论动机如何,这都是一个实验。你可以重新构建自己的
rt.jar
来进行实验,但如果你用“旧”版本运行程序,它可能(将)失败。谢谢,这就是我一直在寻找的。我将进一步研究AspectJ。也许有比修改API更好的方法来实现我正在做的事情,但我还是有兴趣尝试一下。这是唯一适用于这个问题的答案,其余的大部分都在鼓吹不要这样做。@BaileyS-你在否决之前读过我的答案吗?我鼓吹不要这样做,但也给出了一些选择,如果真的需要,可以尝试(包括这一个)。@Don Roby,你是对的,如果你编辑你的问题,我将把我的投票改为+1:)