91名师指路-头部
91名师指路

JVM系列(二):类装载器

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

一:类装载器。

我们打开我们自己本地的一个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     阅读(885)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部