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时,启动类加载器和扩展类加载器都无法加载,最后让应用类加载器处理,最终触发该规则报错。