自定义String类创建

Ani*_*rma 10 java string final class

我试图在我的eclipse工作区中的java.lang包中创建一个自定义类String.最初我怀疑同一个包中的同一个类是无法创建的,但令我惊讶的是我能够在同一个包中创建一个类(String),即java.lang

现在我很困惑
1)为什么有可能和
2)如果允许的话可能是什么原因.
3)如果在Java中允许这种类型的java类创建,将会有什么用处.

Evg*_*eev 9

您可以在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)