`
flyPig
  • 浏览: 138720 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

classloader整理

    博客分类:
  • Java
阅读更多
   classloader它就是用来加载Class文件到JVM,以供程序使用的。我们知道,java程序可以动态加载类定义,而这个动态加载的机制就是通过ClassLoader来实现的.
   所有的classloader都是java写的,除了bootstrap classloader。这个ClassLoader在JVM运行的时候加载java核心的API以满足java程序最基本的需求,其中就包括用户定义的ClassLoader。这里的用户定义是指通过java程序实现的ClassLoader,一个是ExtClassLoader,这个ClassLoader是用来加载java的扩展API的,也就是/lib/ext中的类,一个是AppClassLoader。这个ClassLoader是用来加载用户机器上CLASSPATH设置目录中的Class的,通常在没有指定ClassLoader的情况下,自定义的类就由该ClassLoader进行加载。所以当运行一个程序的时候,基本的加载流程就是:jvm建立-->初始化-->bootstrap classloader被加载-->load位于sun.misc.Launcher中的ExtClassLoader,设置它的parent为null-->load位于sun.misc.Launcher中的AppClassLoader,设置parent为ExtClassLoader-->AppClassLoader载入我们自己的class,但是在AppClassLoader无法载入的时候,它们也有可能被ExtclassLoader或者bootstrap loader载入
  
   我们自定义的ClassLoader都必须继承ClassLoader这个抽象类,而每个ClassLoader都会有一个parent ClassLoader,我们可以看一下ClassLoader这个抽象类中有一个getParent()方法,这个方法用来返回当前ClassLoader的parent。这里之所以这样做,就是所谓的双亲委托模式。当使用一个自定义的classloader加载一个类,classloader会让它的parent classloader去加载,如果parent加载不成功,再拿过来自己加载。如下就是源码:
 protected synchronized Class<?> loadClass(String name, boolean resolve)
	throws ClassNotFoundException
    {
	// First, check if the class has already been loaded
	Class c = findLoadedClass(name);
	if (c == null) {
	    try {
		if (parent != null) {
		    c = parent.loadClass(name, false);
		} else {
		    c = findBootstrapClass0(name);
		}
	    } catch (ClassNotFoundException e) {
	        // If still not found, then invoke findClass in order
	        // to find the class.
	        c = findClass(name);
	    }
	}
	if (resolve) {
	    resolveClass(c);
	}
	return c;
    }



classloader中的一些重要的方法
1)loadClass
ClassLoader.loadClass() 是ClassLoader的入口点。该方法的定义为:Class loadClass( String name, boolean resolve );
name:JVM 需要的类的名称,如 Foo 或 java.lang.Object。
resolve:参数告诉方法是否需要解析类。

2)defineClass
defineClass方法接受由原始字节组成的数组并把它转换成Class对象。

3)findSystemClass
findSystemClass方法从本地文件系统中寻找类文件,如果存在,就使用defineClass将原始字节转换成Class对象,以将该文件转换成类。

4)resolveClass
可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时可以调用resolveClass,这取决于loadClass的resolve参数的值。

5)findLoadedClass
findLoadedClass充当一个缓存:当请求loadClass装入类时,它调用该方法来查看ClassLoader是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。

一些常见的疑问
1.自定义的ClassLoader,它的parent是AppClassLoader。与它被谁加载的并没有关系。
2.ExtClassLoader和AppClassLoader都是URLClassLoader的子类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由 运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定。ExtClassLoader查找的url是系统变量java.ext.dirs默认为jdk\jre\lib\ext。Bootstrap loader的查找url是-Xbootclasspath所指定的路径。在程序运行后System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前,而且sun.boot.class.path是在程序中写死的,完全不能改变。
3.NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件就会报这个错。ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常。

一般应用场景
1.程序运行中加载特别url或自定义的位置的class文件.
2.动态reload class文件.
3.用来加载加密了的class文件,比如用RC4方式加密的class文件,先解密再加载。





分享到:
评论

相关推荐

    2021面试必备--JAVA核心知识点整理.pdf

    类加载器分为启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader),它们遵循双亲委派模型来加载类。OSGi(Open Service Gateway Initiative)是...

    JAVA核心知识整理.pdf

    ### JAVA核心知识整理 #### JVM基础 - **JVM(Java虚拟机)概述**: - Java虚拟机是运行所有Java程序的基础环境,它提供了一个抽象的计算机模型,能够执行编译后的Java字节码。 - **JVM内存区域**: - **程序...

    深入JVM整理文档

    2. **加载**:使用类加载器(ClassLoader)加载字节码到JVM。 3. **执行**:JVM解释执行字节码,可能还会涉及即时编译(JIT)以提高性能。 #### 1.3、加载.class文件的方式 Java程序可以通过以下几种方式加载....

    JSP开发实用技术整理

    这是本人在开发和学习中长期整理出来的,个人认为比较实用,一共11份word文档,含目录方便查看。 这是第一份word文档目录 ===================================== 1.错误页404或500等显示页面配置 1 2.过滤器配置 1 ...

    JAVA核心知识点整理.docx

    * 类加载器(ClassLoader):负责加载Java类文件到内存中。 * 字节码验证器(Bytecode Verifier):负责验证加载的Java类文件是否符合Java语言规范。 * 解释器(Interpreter):负责将Java字节码转换为机器码并执行...

    JAVA核心面试知识整理(全).rar

    - 类加载器:Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader。 - 类的加载与卸载。 这些是Java面试中常见的核心知识点,熟练掌握它们能帮助你在面试中展现出深厚的技术功底。通过深入学习和实践...

    JAVA面试常见问题整理

    12. **Java类加载器**:包括Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader和自定义类加载器,遵循双亲委派机制,保证类加载的安全性和一致性。 13. **双亲委派机制**:类加载时先由顶层...

    JVM与性能优化知识点整理.rar

    类加载器分为Bootstrap ClassLoader、Extension ClassLoader和AppClass ClassLoader,它们共同完成类的加载工作。 2. 运行时数据区:包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。其中,堆存储对象实例,...

    Java动态代理机制详解[整理].pdf

    通常,JVM有三个内置的类加载器:Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader,它们分别负责加载JDK核心库、扩展库和应用类路径下的类。此外,用户还可以自定义类加载器,如示例中的`...

    JAVA核心知识点整理.pdf

    ### JAVA核心知识点整理 #### JVM基础 - **JVM(Java Virtual Machine)**: Java虚拟机是一种抽象计算模型,用于执行Java字节码。它提供了一个运行环境,使得Java程序可以在不同的操作系统上运行而无需修改。 ###...

    java核心知识点整理.pdf

    27 标记整理算法(Mark-Compact).................................................................................................. 28 分代收集算法 ..........................................................

    java常用API[整理].pdf

    Class 和 ClassLoader 是 Java 中两个重要的类,Class 表示一个类的元数据,ClassLoader 负责加载类。Class 提供了许多有用的方法,如 getClassLoader()、newInstance() 等,ClassLoader 提供了许多有用的方法,如 ...

    java学习笔记整理

    【Java学习笔记整理】 Java是一种广泛使用的编程语言,它不仅是一种语言,还是一个软件开发平台和运行环境。Java分为三个主要版本:Java标准版(JSE)、Java缩微版(JME)和Java企业版(JEE)。JSE主要用于桌面应用...

    JVM与性能优化知识点整理.zip

    - **类加载器**:Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader和自定义类加载器。 5. **线程调度** - **线程池**:通过ThreadPoolExecutor管理线程,减少线程创建销毁的开销,提高系统资源...

    Poco 使用说明整理,带例程

    Poco 使用说明整理,带例程 Poco 是一个开源的 C++ 类库的集合,主要提供简单的、快速的网络和可移植应用程序的 C++ 开发。下面是 Poco 的一些重要知识点: 1. Poco 库的模块化、高效的设计及实现使得 Poco 特别...

    Java高阶面试题整理.pdf

    可以使用ClassLoader类来实现类加载。 3.堆内存设置:堆内存设置是JVM中的一个参数,用于设置堆内存的大小。可以使用-Xmx参数来设置堆内存的大小。 Linux 1.命令行工具:命令行工具是Linux中的一个功能,用于执行...

    Java Resource路径整理总结

    Java Resource路径整理总结 Java Resource路径整理总结是 Java 编程语言中一个重要的知识点,主要介绍了 Java 中 Resource 路径的整理总结,旨在帮助开发者更好地理解和使用 Resource 路径。 Java Resource 路径...

    Glassfish 3.1.2.2 JPA問題整理 EclipseLink 如何更新1

    这同样可能是由于JPA元数据的问题,或者与ClassLoader有关,导致JPA无法正确解析和建立这些关系。 问题推测: 从日志分析,感觉问题在于ClassLoader加载的对象是正确的,但是在JPA进行实体注入时出现了问题。JPA的...

    jvm的资源整理

    JVM的类加载机制遵循双亲委派模型,从Bootstrap ClassLoader开始,依次通过Extension ClassLoader和Application ClassLoader加载类,最后到自定义ClassLoader。这个机制保证了类的唯一性,避免了类的重复加载。 ...

Global site tag (gtag.js) - Google Analytics