Java加载自定义的String, Object

1、加载自定义的java.lang.Object

package java.lang;

public class Object {

    public static void main(String[] args) {
        Object object = new Object();
    }
}

报错:

错误: 在类 java.lang.Object 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

分析:

根据双亲委派模型,应用类加载器根据字符串“java.lang.Object”加载类的时候,最终会委派启动类加载器去加载这个类。因此,最终加载的是rt.jar包下的java.lang.Object,而该类没有main()方法,因此报错。自定义的java.lang.Object没有被加载。

2、加载java.lang.String

package java.lang;

class String {
    int i;
}

public class Test {
    public static void main(String[] args) {
        String object = new String();
    }
}

报错:

java.lang.SecurityException: Prohibited package name: java.lang
	at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"

分析:

系统先要加载java.lang.Test类,但是加载失败,原因:用户不可以定义java.开头的类

if ((name != null) && name.startsWith("java.")) {
            throw new SecurityException
                ("Prohibited package name: " +
                 name.substring(0, name.lastIndexOf('.')));
        }

那为什么之前定义java.lang.Object没这个报错?启动类找到了java.lang.Object并成功加载,就不会让应用类加载器继续处理,而处理java.lang.Test时,启动类加载器和扩展类加载器都无法加载,最后让应用类加载器处理,最终触发该规则报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值