为什么只有启动类加载器才能加载Java.lang

379 阅读1分钟

原因如下:

if (!checkName(name))
            throw new NoClassDefFoundError("IllegalName: " + name);

        // Note:  Checking logic in java.lang.invoke.MemberName.checkForTypeAlias
        // relies on the fact that spoofing is impossible if a class has a name
        // of the form "java.*"
        if ((name != null) && name.startsWith("java.")) {
            throw new SecurityException
                ("Prohibited package name: " +
                 name.substring(0, name.lastIndexOf('.')));
        }

因为扩展类加载器和系统类加载器也是用Java写的, 所以他们和自定义类加载器加载类的时候都会走这个defineClass方法,这个方法加了校验,发现已Java开头的全限定名,就会报错