`
蒋小辉
  • 浏览: 3603 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

java Class Loader

 
阅读更多

JVM包含3个ClassLoader:
           bootstrap class Loader(调用java.exe时载入java核心类)、
           extension class loader(载入jdk/jre/lib/ext目录下的jar)、
           system class loader(载入环境变量CLASSPATH指定的jar)。


默认的是system class loader。


一个class文件的载入过程:(使用delegation model模式)

       jvm首先调用system class loader,system class loader delegate给它父类extension class loader。同样extension class loader也不立即loader这个class,而是delegate给它的父类bootstrap class loader。

       然后bootstrap class loader首先调用其load方法载入类,如果没找到,extension class loader将接过任务由它载入,仍然没找到,则system class loader来接手。

       最后如果都没载入的话,一个ClassNotFoundException异常被抛出。


每个ClassLoader加载Class的过程是:
1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
2.如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
3.请求parent classloader载入,如果成功到8,不成功到5
4.请求jvm从bootstrap classloader中载入,如果成功到8
5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.
6.从文件中载入Class,到8.
7.抛出ClassNotFoundException.
8.返回Class.


该class类载入机制,可以有效的保证代码安全。

比如:当某人编写了一个怀有恶意代码的java.lang.Object类时(jvm信任java.lang.Object,不会检查该类中的操作。),根据上面class文件载入过程的描述,最先调用loader进行实质性载入的是bootstrap class loader,它被调用后找到系统中的java.lang.Object类后返回,客户化的Object类将被忽略。


那么我们如何实现在运行时的动态载入和更新呢?只要我们能够动态改变类搜索路径和清除classloader的cache中已经载入的Class就行了, 有 两个方案,一是我们继承一个classloader,覆盖loadclass方法,动态的寻找Class文件并使用defineClass方法来;另一个 则非常简单实用,只要重新使用一个新的类搜索路径来new一个classloader就行了,这样即更新了类搜索路径以便来载入新的Class,也重新生成了一个空白的cache(当然,类搜索路径不一定必须更改)。噢,太好了,我们几乎不用做什么工作,java.netURLClassLoader正是 一个符合我们要求的classloader!我们可以直接使用或者继承它就可以了!


全盘负责原则:

      由同一个classloader导入一个class所依赖的所有class。


参考:http://www.cnblogs.com/yangy608/archive/2011/07/23/2114900.html

分享到:
评论

相关推荐

    java class loader(JAVA类加载器)

    自己收集的java class loader相关的一些网络资源文档, 希望对大家有所帮助

    Java Class Loader总结.doc

    Java Class Loader总结

    java 类加载器 class loader

    java 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loader

    深入Class Loader

    深入 Java 的Class Loader(类加载器)

    class loader

    Dynamic class loading in the Java Virtual Machine

    深入java虚拟机(inside the java virtual machine)

    The Class Loader Architecture The Java Class File The Java API The Java Programming Language Architectural Tradeoffs Future Trends On the CD-ROM The Resources Page 2 Platform independence Why ...

    Java经典入门教程pdf完整版

    loader Byte code Verifier Javac Hello.java Netwo Hello class Interpreter code Runtime generator/ Hardware 1:编写代码 首先把我们想要计算机做的事情,通过Java表达出来,写成Java文件,这个过程就是 编写代码的...

    Class Loader:在没有命令提示符的情况下执行Java .class文件-开源

    Class Loader 是一个可视化的基本 .net 2.0 软件。 使用类加载器,您可以在没有命令提示符的情况下执行 .class 文件。 只需打开类文件!

    js-class-loader:(Java) 快速 Javascript 聚合器捆绑器,具有依赖项检测功能

    js 类加载器(Java) 一种免费软件工具,用于捆绑和提供具有内置依赖项检测功能的大型 Javascript 代码库。 请参阅网站 和 github 仓库: : 了解更多信息。

    JAVA白皮书(英文版)

    6.2Security Checks in the Class Loader 6.3The Byte Code Verification Process 6.3.1The Byte Code Verifier 6.4Security in the Java Networking Package 6.5Summary 7. Multithreading 7.1...

    深入解析Java中的Class Loader类加载器

    主要介绍了Java中的类加载器,是Java入门学习中的基础知识,需要的朋友可以参考下

    hive-jdbc-1.1.0-cdh5.4.5-standalone.jar

    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal....

    Java常用基础知识-kaic.docx

    你可以创建个新的class loader,然后用loadClass加载,再newInstance;原来加载的classloader是不能重新加载的;这算是一个典型的容器思路。 《深入理解java虚拟机》 2、对java“书写一次,到处运行”(Write once, ...

    hive-jdbc-2.1.0-standalone.jar

    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) at org.eclipse.osgi.internal....

    Java虚拟机 JVM 内存结构介绍

    描述Java虚拟机规范中关于内存管理的部分 主要介绍Runtime Data Area,包括Java Stack,Native Method Stack, ...还简要介绍了Runtime Data Area周边的模块,包括Class Loader,Execution Engine,Native Interface

    深入Java虚拟机读书笔记1

    Java虚拟机的基本结构图:Java虚拟机包含一个类装载器(class loader),可以从程序和API中装载class文件,其中API只有程序执行时需要的那

    jboss 5 原理 2 classloader

    With OSGi-style classloading getting more and more traction, and a number of new Java modules/classloading specifications on the horizon, it was high time we revamped our classloading layer in order ...

    javacv-platform-1.3.3-src

    The class definitions are basically ports to Java of the original header files in C/C++, and I deliberately decided to keep as much of the original syntax as possible. For example, here is a method ...

    commons-beanutils-1.7.0

    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) at org.apache.catalina...

    深入探讨 Java 类加载器

    类加载器(class loader)是 Java™ 中的一个很重要的概念。类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式、加载类的具体过程和线程上下文类加载...

Global site tag (gtag.js) - Google Analytics