加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 自定义String类创建

发布时间:2020-12-14 16:45:29 所属栏目:Java 来源:网络整理
导读:我试图在我的 eclipse工作区中的 java.lang包中创建一个自定义类String. 最初我怀疑同一个包中的同一个类不能创建,但是令我惊奇的是,我能够在同一个包中创建一个类(String),即java.lang 现在我很困惑 1)为什么可能和 2)如果允许的话可能是什么原因. 3)如果在
我试图在我的 eclipse工作区中的 java.lang包中创建一个自定义类String.
最初我怀疑同一个包中的同一个类不能创建,但是令我惊奇的是,我能够在同一个包中创建一个类(String),即java.lang

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

解决方法

您可以在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,它们不能加载,因为System ClassLoader(默认使用)使用“父第一”策略,因此java.lang类将从rt.jar与引导类加载器一起加载.所以你需要在rt.jar中替换你的版本的String.class.或者使用-Xbootclasspath / p:java选项来覆盖它,它将路径添加到引导类加载器搜索路径中.所以你可以

1)将copypaste真正的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读