您可以在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('.')));
}
...
Run Code Online (Sandbox Code Playgroud)
所以你最终会得到类似的东西
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)
Run Code Online (Sandbox Code Playgroud)
对于影响现有类的类,如java.lang.String
因为System ClassLoader(默认值为1)使用"父优先"策略而无法加载它们,因此将使用bootstrap类加载器从rt.jar加载java.lang类.因此,您需要将rt.jar中的String.class替换为您的版本.或者使用java选项覆盖它,该-Xbootclasspath/p:
选项预先设置引导类加载器搜索路径的路径.所以你可以
1)将copypaste真正的String.java内容放入你的String.java中
2)改变方法,例如
public static String valueOf(double d) {
return "Hi";
}
Run Code Online (Sandbox Code Playgroud)
并编译你的String.java
3)创建一个测试类
public class Test1 {
public static void main(String[] args) throws Exception {
System.out.println(String.valueOf(1.0d));
}
}
Run Code Online (Sandbox Code Playgroud)
4)运行它
java -Xbootclasspath/p:path_to_your_classes Test1
Run Code Online (Sandbox Code Playgroud)
你会看到的
Hi
Run Code Online (Sandbox Code Playgroud)