原 JVM系列(二):类装载器
版权声明:本文为博主原创文章,请尊重他人的劳动成果,转载请附上原文出处链接和本声明。
本文链接:https://www.91mszl.com/zhangwuji/article/details/1182
一:类装载器。
我们打开我们自己本地的一个class文件。采用EditPlus,编码选择16进制查看器打开。
打开后的效果,也就是之前我们说的,文件开头有特定的文件标示。
二:类加载器的种类。
代码演示:
package com.mszl.jvm;
/**
* 功能:类加载器
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
public class MyObject {
public static void main(String[] args) {
Object obj=new Object();
System.out.println(obj.getClass().getClassLoader()); // null
MyObject mt=new MyObject();
System.out.println(mt.getClass().getClassLoader().getParent().getParent());
System.out.println(mt.getClass().getClassLoader().getParent());
System.out.println(mt.getClass().getClassLoader()); // sun.misc.Launcher$AppClassLoader@1d16e93
}
}
执行结果:
null
null
sun.misc.Launcher$ExtClassLoader@1db9742
sun.misc.Launcher$AppClassLoader@1d16e93
System.out.println(obj.getClass().getClassLoader()); // null,是启动类加载器BootStrap,采用c++写的,而我们这里是java,所以为空。
System.out.println(mt.getClass().getClassLoader()); // sun.misc.Launcher$AppClassLoader@1d16e93,是我们自己写的类,所以为应用程序类加载器。
三:双亲委派
代码演示:
我们新建一个包:java.lang,类名为String.java,如下图所示。
package java.lang;
public class String {
public static void main(String[] args) {
System.out.println("www.91mszl.com");
}
}
执行结果
错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
在jdk的lib包的rt.jar的java.lang包下面也有String.java类。
根据双亲委派原理,它是先去父类那里找,找不到才使用子类的(这就叫做沙箱安全),现在是父类那里也有String.java这个类,则会使用父类的String,父类的String类中没有main方法,所以报错:
错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
2020-03-27 21:20:07 阅读(886)
名师出品,必属精品 https://www.91mszl.com
博主信息