您可以在 java.lang 包中创建一个新类。如果禁止 Oracle 开发人员如何开发 Java?我相信他们使用的 javac 和我们一样。
但是您将无法加载它,因为 java.lang.ClassLoader(任何类加载器都扩展)不允许它,每个正在加载的类都经过此检查
...
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " + name.substring(0, name.lastIndexOf('.')));
}
...
所以你最终会得到类似的东西
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:649)
at java.lang.ClassLoader.defineClass(ClassLoader.java:785)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at Test1.main(Test1.java:11)
至于像 java.lang.String 这样隐藏现有类的类,它们无法加载,因为系统类加载器(默认)使用“父优先”策略,因此 java.lang 类将使用引导类加载器从 rt.jar 加载。因此,您需要将 rt.jar 中的 String.class 替换为您的版本。或者使用-Xbootclasspath/p: java 选项覆盖它,该选项将路径添加到引导类加载器搜索路径。所以你可以
1) 将真实的 String.java 内容复制粘贴到您的 String.java 中
2) 改变方法,例如
public static String valueOf(double d) {
return "Hi";
}
并编译你的 String.java
3) 创建一个测试类
public class Test1 {
public static void main(String[] args) throws Exception {
System.out.println(String.valueOf(1.0d));
}
}
4) 运行为
java -Xbootclasspath/p:path_to_your_classes Test1
你会看到
Hi