0
点赞
收藏
分享

微信扫一扫

vue之elementUi的el-select同时获取value和label的两种方法

霍华德 2024-02-09 阅读 6
java

类加载器的定义

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,类加载器只参与加载过程中的字节码获取并加载到内存这一部分。类加载器会通过二进制流的方式获取到字节码文件的内容,接下来将获取到的数据交给Java虚拟机,虚拟机会在方法区和堆上生成对应的对象保存字节码信息。

类加载器的分类

 类加载器分为两类,一类是Java代码中实现的,一类是Java虚拟机底层源码实现的

类加载器的设计JDK8和8之后的版本差别较大,首先来看JDK8及之前的版本,这些版本中默认的类加载器有如下几种:

 类加载器的详细信息可以通过Arthas的classloader命令查看:

 

 启动类加载器

Java
/**
 * 启动程序类加载器案例
 */
public class BootstrapClassLoaderDemo {
    public static void main(String[] args) throws IOException {
        ClassLoader classLoader = String.class.getClassLoader();
        System.out.println(classLoader);

        System.in.read();
    }
}

 这段代码通过String类获取到它的类加载器并且打印,结果是null。这是因为启动类加载器在JDK8中是由C++语言来编写的,在Java代码中去获取既不适合也不安全,因为启动类加载器java的底层类库,不应该让我们随意获取,去改变java底层类,所以才返回null

 在Arthas中可以通过sc -d 类名的方式查看加载这个类的类加载器详细的信息,比如:

查看String类的类加载器就是空

用户扩展基础jar

如果用户想扩展一些比较基础的jar包,让启动类加载器加载,有两种途径:

 如下图,在IDEA配置中添加虚拟机参数,就可以加载D:/jvm/jar/classloader-test.jar这个jar包了。

 

扩展类加载器和应用程序类加载器 

 扩展类加载器和应用程序类加载器继承自URLClassLoader,获得了下述的三种能力。

 扩展类加载器

扩展类加载器(Extension Class Loader)是JDK中提供的、使用Java编写的类加载器。默认加载Java安装目录/jre/lib/ext下的类文件。

如下代码会打印ScriptEnvironment类的类加载器。ScriptEnvironment是nashorn框架中用来运行javascript语言代码的环境类,他位于nashorn.jar包中被扩展类加载器加载 

Java
/**
 * 扩展类加载器
 */
public class ExtClassLoaderDemo {
    public static void main(String[] args) throws IOException {
        ClassLoader classLoader = ScriptEnvironment.class.getClassLoader();
        System.out.println(classLoader);
    }
} 

 

 通过扩展类加载器去加载用户jar包:

 使用引号将整个地址包裹起来,这样路径中即便是有空格也不需要额外处理。路径中要包含原来ext文件夹,同时在最后加上扩展的路径。

  应用程序加载器

应用程序类加载器会加载classpath下的类文件,默认加载的是项目中的类以及通过maven引入的第三方jar包中的类。

如下案例中,打印出StudentFileUtils的类加载器:

Java
/**
 * 应用程序类加载器案例
 */
public class AppClassLoaderDemo {
    public static void main(String[] args) throws IOException, InterruptedException {
        //当前项目中创建的Student类
        Student student = new Student();
        ClassLoader classLoader = Student.class.getClassLoader();
        System.out.println(classLoader);

        //maven依赖中包含的类
        ClassLoader classLoader1 = FileUtils.class.getClassLoader();
        System.out.println(classLoader1);

        Thread.sleep(1000);
        System.in.read();

    }
}

 这两个类均由应用程序类加载器加载。

 类加载器的加载路径可以通过classloader –c hash值 查看:

举报

相关推荐

0 条评论