原因如下:
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开头的全限定名,就会报错