`
suichangkele
  • 浏览: 197929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

类加载器

    博客分类:
  • java
阅读更多

我一直没有掌握java的类加载器,直到最近我看log4j2的源码时又好好研究了一下,才稍微懂点。在log4j2中有个功能是收集某个包下面的所有的类,以及写在某个文件中的类,这些都是需要classloader来完成的,于是顺着他的思路以及自己做实验我才慢慢稍微掌握了classLoader。

java的classLoader分为好几类,并且是有阶级关系的,一层一层的继承。最跟类是java自带的,这个我们看不到,他负责加载java运行时的一些核心class(比如JAVA_HOME/jre下面的类),这个加载器不需要我们操心,因为他不会给我带来麻烦和不会带来坏处,他是java的底层。还有一个也是不需要操心的——java的拓展类加载器,这个是刚才提到的classLoader的一个子类,也是用来加载一些核心类(我从网上搜,也是说加载JAVA_HOME/jre下面的类)。第三个是系统类加载器,这个继承自刚刚说的第二个classLoader,他负责加载classpath下的类,我们在系统变量里面配置的classpath就是起到这个作用。当我们在程序里面有一段代码时(不是在容器里面运行,而是手动的javac之后 java),我们就会发现他会使用一个叫做sun.misc.Launcher$AppClassLoader 的类加载器,他会加载当前类的原因就是因为classpath里面有个“.”,表示当前的目录下面进行查找,我猜测这个应该就是上面说的系统类加载器。

代码很简单,这里就不上了,记住不是在容器里面跑的,而是调用的 java命令。

 

但是在容器里面执行时就不一样了,比如我们可以在tomcat下有一个app(使用的springmvc),他的有个controller里面的方法如下:

@RequestMapping("a.do")
@ResponseBody
public void a() {
	System.out.println(A.class.getClassLoader());
}

 当访问这个controller的时候就会打印如下的classloader:

WebappClassLoader

  context: /spring

  delegate: false

  repositories:

    /WEB-INF/classes/

----------> Parent Classloader:

org.apache.catalina.loader.StandardClassLoader@3b5b0734

很明显他是apache的一个classloader,也就是tomcat的,所以很明显是tomcat自己写的classloader,然后从/WEB-INF/classes下面加载class。也就是说我们可以自己写classloader来加载指定路径下面的class。在classloader的官方文档(jdk7)中,有这么一句话:Applications implement subclasses of ClassLoader in order to extend the manner in which the Java virtual machine dynamically loads classes:翻译过来是应用程序可以自己实现ClassLoader以创建自己的类加载器,可以拓展jvm加载类的方式。也就是说我们自己定义的classloader必须实现jdk的java.lang.Classloader类(我自己没有手动实验)

 

类加载器是基于父类委托的方式,即每一次加载一个类的时候会先委托给父亲进行加载,如果父亲加载到了就使用父亲找到的那个class,如果父亲没有加载到,才会自己加载。这样做的好处是使得jvm变得更加安全,如果没有父类委托机制的话我们可以写一个classloader,然后加载java.lang.String类,这样所有的String类就会都被改变了,导致jvm无法运行,而如果有了父类加载机制,这样的事情就不会发生,java的核心加载器也就是我们定义的加载器的父类已经加载了jdk的String类,我们即使手动的加载一个我们自己写的java.lang.String也无法成功。

分享到:
评论

相关推荐

    自定义Java类加载器

    Java类加载器是Java虚拟机(JVM)的关键组成部分,它负责查找并加载类到内存中,使得程序能够运行。自定义Java类加载器允许我们根据特定需求扩展默认的加载机制,例如,从非标准位置加载类或者实现动态加载。在Java...

    java类加载器

    类加载器的设计遵循双亲委派模型,它分为三个主要部分:启动类加载器、扩展类加载器和应用类加载器。 #### 二、类加载过程 类加载过程主要包括三个步骤: 1. **加载**:通过类的全限定名找到该类的二进制字节流。...

    类加载器文件

    ### 类加载器详解 #### 一、类加载器概述 **类加载器(ClassLoader)**是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译好的`.class`文件加载到JVM中,使得这些类可以在Java环境中运行。类加载器不仅能够加载类...

    自定义类加载器实现自定义加载

    - Java中的类加载器采用双亲委派模型,即一个类首先由启动类加载器Bootstrap ClassLoader尝试加载,如果找不到则交给扩展类加载器Extension ClassLoader,再找不到则交由应用程序类加载器AppClassLoader,最后如果...

    自定义类加载器

    在Java编程语言中,类加载器(ClassLoader)是运行时环境的一个重要组成部分,它负责将类的字节码从各种来源加载到Java虚拟机(JVM)中,从而使得程序可以执行。自定义类加载器允许开发人员根据特定需求定制加载类的...

    tomcat类加载器

    类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到到达顶层的Bootstrap ClassLoader,如果父类加载器无法找到该类,子类加载器才会尝试自己加载。 在Tomcat...

    Java类加载器原理

    Java 类加载器原理 Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将类的字节码加载到内存中并转换为可执行的Java类。类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定...

    ClassLoader类加载器

    1. Bootstrap ClassLoader:这是最基础的类加载器,由JVM本身实现,负责加载JRE的`<JAVA_HOME>/lib`目录下的核心类库,或者被`-Xbootclasspath`参数指定的路径中的类。 2. Extension ClassLoader:扩展类加载器,...

    类加载器(java)

    类加载器的知识不仅仅局限于基础概念,还包括类加载的时机(静态加载、动态加载)、类加载器的实现(如自定义类加载器)、类的卸载、以及类加载器与安全策略的关系等。深入理解和掌握这些知识点,对于开发高效、安全...

    java类加载器实例

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    JVM类加载器说明文档

    系统类加载器在加载类时,会先尝试让扩展类加载器加载,如果扩展类加载器无法加载,则再由系统类加载器自己尝试加载。这样的设计是为了保证核心类库的唯一性和安全性,避免用户自定义的类覆盖了 JDK 内置的核心类。 ...

    ModRunJava类加载器可以直接从Maven存储库加载并运行类

    Java开发中的类加载器是Java运行环境的核心组件之一,它负责查找、加载和初始化类文件。在传统的Java应用中,类通常是从硬盘上的类路径(ClassPath)或模块路径(ModulePath)中加载的。然而,随着开发模式的演变,...

    java 类加载器 加密

    Java 类加载器是Java运行时环境的一个重要组成部分,它的主要职责是将编译后的字节码(.class文件)加载到JVM中,使得程序能够运行。类加载器的机制保证了类的唯一性,同时也提供了灵活性,允许我们自定义加载逻辑。...

    java应用程序类加载器,ClassLoader for java Application

    在Java中,类加载器按照层次结构进行组织,包括引导类加载器、扩展类加载器和应用程序类加载器,每个都有特定的职责。 1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,由JVM本身实现,主要...

    Java的类加载器

    Java的类加载器是Java虚拟机(JVM)的核心组件之一,它负责将类的字节码从磁盘、网络或其他数据源加载到内存中,并转换为可执行的Java对象。类加载器不仅关乎程序的运行,还在实现动态加载、插件系统等方面发挥着...

    java 静态代码块通过类加载器获取资源文件例子

    在Java编程中,静态代码块(Static Block)和类加载器(Class Loader)是两个重要的概念,它们在软件开发中有着广泛的应用。本案例聚焦于如何利用静态代码块结合类加载器来高效地获取资源文件,尤其是属性配置文件。...

    网络类加载器实现

    默认的类加载器包括bootstrap classloader(引导类加载器)、extension classloader(扩展类加载器)和appclassloader(应用程序类加载器),它们按照双亲委托模型进行工作,从基础到具体逐层尝试加载类。...

    黑马程序员------类加载器学习注意点

    在Java编程语言中,类加载器(ClassLoader)是至关重要的组成部分,它负责将类的字节码从磁盘、网络或其他存储介质加载到JVM(Java虚拟机)中,并将其转换为可执行的Java对象。类加载器的学习是深入理解Java运行机制...

    类加载器代码

    类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的字节码从文件系统或网络中加载到JVM中,并转换为运行时的java.lang.Class对象。类加载器不仅涉及程序的启动,还关系到类的动态加载、类间的隔离以及安全性...

Global site tag (gtag.js) - Google Analytics