classloader分类
启动类装载器
扩展类装载器
应用装载器
启动类装载器加载java基本api相关的类。
扩展装载器加载JAVA_HOME/jre/lib/ext目录下的class文件
应用装载器加载应用程序相关jar包及程序相关class
启动顺序
启动类装载器---->扩展类装载器---->应用装载器
类装载器执行
类装载采用双亲委托模式,即应用装载器请求它的父装载器(扩展装载器),扩展装载器请求它的父装载器(启动装载器),顶层的装载器一定是启动类装载器,如果父装载器不能返回所需类,就由自己来加载。
类装载器的安全机制
jvm可以有多个classloader,每一个classloader都有一个名称空间唯一标识,只有同一个名称空间内的类采可以相互访问。
如果非启动类装载器试途装载java.lang.Integer类,该操作将被jvm取消,因为Integer经过由启动类装载器装载。
如果某个classloader试途装载一个恶意的class,如java.lang.Virus,该类在相关的父classloader中没有,所以将成功装载,问题是该类位置java.lang包中,这是非常危险的,这表明它可以访问java.lang中的相关类,但是classloader的名称空间不同virus还是不可以访问java.lang中的类,也就是说对于用户级的classloader加载的类只会拥有在同一个classloader同一个包的访问权限。
classloader还有一个安全域的概念,即classloader将被加载的类放入一个安全域中,安全域决定该类在运行时的权限。
相关api
获得boot classloader
sun.misc.Launcher.getBootstrapClassPath()
获得应用classloader
ClassLoader.getSystemClassLoader()
获得扩展classloader
ClassLoader.getSystemClassLoader().getParent()
用户可以自定义classloader
自定义ClassLoader需要继承ClassLoader抽象类,重写findClass方法,这个方法定义了ClassLoader查找class的方式。
主要可以扩展的方法有:
findClass 定义查找Class的方式
defineClass 将类文件字节码加载为jvm中的class
findResource 定义查找资源的方式
如果嫌麻烦的话,我们可以直接使用或继承已有的ClassLoader实现,比如
java.net.URLClassLoader
java.security.SecureClassLoader
java.rmi.server.RMIClassLoader
sun.applet.AppletClassLoader
Extension ClassLoader 和 App ClassLoader都是java.net.URLClassLoader的子类。
这个是URLClassLoader的构造方法:
public URLClassLoader(URL[] urls, ClassLoader parent)
public URLClassLoader(URL[] urls)
分享到:
相关推荐
`CH_05.package与import机制.pdf`可能讲解了与ClassLoader相关的包和导入机制,因为它们与类的组织和加载密切相关。 `CH_03.Java与MS Office.pdf`、`CH_04.用Visual Studio.net来操控Java虚拟机.pdf`、`CH_06.Ant....
本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种基本类型:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。Bootstrap ClassLoader是JVM...
本文将深入探讨“使用classloader动态加载Class”的相关知识点,同时参考了博客链接:https://ldbjakyo.iteye.com/blog/1046984。 首先,理解ClassLoader的工作原理至关重要。Java中的类加载过程分为三个主要阶段:...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中。...通过学习这些知识点,开发者可以更好地优化代码、设计更健壮的系统,并解决与类加载和初始化相关的复杂问题。
- 如需了解更多关于类加载器的信息,可以访问IBM developerWorks网站上的相关文章。 - 另外,Greg Travis的联系方式也提供给了读者,如果有关于教程内容的问题,可以直接联系他获得帮助。 总之,《classloader教程 ...
例如,在Web应用中,通常只有当用户访问特定URL时才加载相关的Servlet或JSP页面。 #### 类型安全链接(Type-Safe Linkage) 为了确保动态加载的类与已加载的类之间能够正确地交互,Java虚拟机必须执行一系列的链接...
在"my_classloader"文件中,可能包含了这个类加载器的源代码、测试用例或其他相关资源。分析这些文件可以帮助我们更好地理解C++类加载器的具体实现细节,包括它是如何处理类的加载、解析和实例化的。 总之,类加载...
《深入Java虚拟机_ClassLoader》是一本...通过阅读《深入Java虚拟机_ClassLoader》这本书,开发者可以掌握更高级的JVM技巧,优化程序性能,解决类加载相关的复杂问题,并为构建高效、安全的Java应用程序打下坚实基础。
本文将深入探讨一个简单的`ClassLoader`实现,以及与之相关的知识点。 首先,我们来看标题:“一个简单的ClassLoader”。这里的“简单”通常意味着这个自定义`ClassLoader`只实现了基本的功能,如加载特定位置的...
### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载...总之,理解和掌握Java类加载器的相关知识对于提高程序设计能力具有重要意义。希望本文能帮助读者更好地理解和应用Java类加载器。
此外,熟悉ClassLoader还能提升对Java安全模型的理解,因为类加载与权限控制紧密相关。 总之,ClassLoader是Java运行时环境中的关键组件,理解其工作原理和如何自定义ClassLoader对于提高开发者的技术深度和解决...
通过理解其源码,我们可以更深入地了解Tomcat的工作方式,从而优化应用性能,解决类加载相关的复杂问题。对于开发者而言,这是一次宝贵的深入学习Java和Tomcat底层机制的机会。通过阅读和分析源码,我们可以不断提升...
在提供的文件列表中,`Dynamic`和`ForceApkObj`可能分别代表动态加载相关的源代码文件和类对象。在`ForceApkObj`中,可能包含了一个强制加载APK中特定类的对象,这在处理插件化或模块化时非常有用。通过分析这些源...
对于标题“Java SE: ClassLoader in depth”和描述中提到的“源码”、“工具”,实际上在给出的内容部分并没有任何与Java ClassLoader深入相关的技术信息。所提供的内容实际上是一份公司入职报到的指南,与Java编程...
线程上下文类加载器是在Java 2(J2SE)引入的新概念,每个线程都有一个相关的上下文类加载器。默认情况下,新线程会继承其父线程的上下文类加载器。在Web应用和企业级应用中,应用服务器会利用复杂的类加载器结构来...
Android类加载器(ClassLoader)是Android系统中负责查找和加载类的重要组件。在深入理解Android的ClassLoader之前,我们先回顾一下...理解ClassLoader的工作原理对于解决Android系统中与类加载相关的各种问题至关重要。
在Java编程语言中,类加载机制(ClassLoader)是理解JVM(Java Virtual Machine)工作原理的关键部分。...通过学习ClassLoader的源码、使用相关的工具以及研究JVM文档,开发者可以更好地掌控Java应用程序的运行。
在“不可见类访问”这个主题中,徐培成老师可能会讲解如何处理这种问题,例如使用反射API(java.lang.reflect)来访问非公共类或者使用相同的类加载器加载相关类,以实现类间的可见性。此外,他还可能会讨论如何通过...