`
cfan_haifeng
  • 浏览: 120171 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

java类加载器-关于保证“一个类的字节码仅被加载一次

    博客分类:
  • jvm
阅读更多

       先说一件事,我想在正在情况下(多数情况下)jvm一定希望不希望一个类的字节码被加载多次。那如何保障呢?都知道通过“委托模式。呵呵,具体的看完下面的内容就知道了。

 

 

 

 

1.ExtClassLoader如何保证字节码仅被加载一次

 

 

     逻辑上来说ExtClassLoader的父加载器是Bootstrap,。

 

     具体到代码,ExtClassLoader继承了URLClassLoader,URLClassLoader继承了类SecureClassLoader,最终一直到抽象类ClassLoader。

 

      为了保证“一个类的字节码仅被加载一次”这个目标。ExtClassLoader要做的有两件事:

     a.保证“  private ClassLoader parent;”正确。(对于ExtClassLoader来说这里为null)

     b.不要重写“ public Class<?> loadClass(*) throws ClassNotFoundException”方法。

 

而最终顶级抽象类ClassLoader中是这么写的

 

 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;
    }
 

 

      通过上面的代码可以看出来,实际加载类时,子加载器递归调用父加载器的loadClass(**)方法,直到到达顶级(parent==null)时,方才调用findBootstrapClass0(**)。这时如果抛出了ClassNotFoundException异常,就表示还没加载呢,然后去调用具体的 findClass(name)实现加载。

 

 

 

2. AppClassLoader 如何保证字节码仅被加载一次

 

      AppClassLoader与ExtClassLoader在保证“一个类的字节码仅被加载一次”这个目标上类似。虽然loadClass方法,但在最后调用了“return super.loadClass(paramString, paramBoolean);”,所以仍旧是OK的。如下所示:

 

 

   public synchronized Class loadClass(String paramString, boolean paramBoolean)
      throws ClassNotFoundException
    {
      DownloadManager.getBootClassPathEntryForClass(paramString);
      int i = paramString.lastIndexOf(46);
      if (i != -1) {
        SecurityManager localSecurityManager = System.getSecurityManager();
        if (localSecurityManager != null)
          localSecurityManager.checkPackageAccess(paramString.substring(0, i));
      }

      return super.loadClass(paramString, paramBoolean);
    }
 

&

 

分享到:
评论

相关推荐

    掌握Java类加载器

    类加载器从源文件(通常是.class 或 .jar文件)获得不依赖平台的字节码,然后将它们加载到JVM内存空间,所以它们能被解释和执行。默认状态下,应用程序的每个类由java.lang.ClassLoader加载。因为它可以被继承,所以...

    深入理解java类加载机制

    此外,我们还会探讨Java程序的类加载器和双亲委派机制,以及自定义类加载器和类卸载的实现原理和应用方法。 总的来说,本资源将为Java程序员提供全面的Java字节码和类加载原理和实践经验。通过学习本资源,开发人员将...

    免费开源!!Java字节码工程工具包

    Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是Java中用于编辑字节码的类库;它使 Java 程序能够在运行时定义新类,并在 JVM 加载时...另一方面,字节码级API允许用户像其他编辑器一样直接编辑类文件。

    Java字节码揭秘

    Java字节码揭秘(Java体系结构、执行引擎、类加载器 等等)

    Java学习笔记

    类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 健壮 3.面向对象 面向过程: 程序:函数+变量 (算法+数据结构) 面向对象: 如:SmallTalk 程序:对象和对象相互之间的“通讯” ...

    java源码包---java 源码 大量 实例

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java类加载器加载类顺序

    java ClassLoader的学习  java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class...  一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL

    详解JAVA类加载机制(推荐)

    JAVA源码编译由三个过程组成: 1、源码编译机制。 2、类加载机制 ...系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类,当运行某个java程序时,会启动一个java虚拟机进程,两次运行

    3_类加载与字节码技术2

    1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6. 运行期优化 1. 类文件结构

    Java类加载顺序笔试题-Nicobar:尼科巴

    是一个 Java 动态脚本框架,由强大的基于 . 脚本可以是源代码,用 JVM 兼容语言(如 Groovy)编写,也可以是编译后的字节码,以 .class 文件的形式。 脚本可以从持久性中动态获取,(编译和)转换为模块,并根据模块...

    Java 类加载机制详解

    在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这是类加载器的功能。我们可以利用类加载器,实现类的动态加载。 ...

    javassist:Java字节码工程工具包

    它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时定义新类,并在JVM加载它时修改类文件。 与其他类似的字节码编辑器不同,Javassist提供了两个级别的API:源级别和字节代码级别。 如果用户使用源代码级...

    java jdk-api-1.6 中文 chmd

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    反射-类加载之间的关联关系

    1、 使用反射方法强制创建某各类或者接口对应的java.lang.Class对象时,会进行类加载,(而类加载会将字节码的class文件读入内存,并为之创建一个Class对象)。 2、 反射让类加载了,当然接着可以调用类的属性和方法...

    java虚拟机2021面试题第一季

    4. 类加载和链接:JVM通过类加载器负责将字节码加载到内存中,并进行链接和初始化。类加载器还支持动态类加载和运行时扩展。 5. JIT编译:JVM还具备即时编译(Just-In-Time Compilation)的能力,它可以根据运行时...

    飞翔的小鸟java源码-java-cheat-sheet:JAVA的所有基本概念

    飞翔的小鸟java源码为什么如此受欢迎 平台无关、OOP、安全性、丰富的 API、IDE、Web、移动、...#####第一个Java程序 public class Main { public static void main ( String [] args ) { System . out . println( " He

    j-j-jvm:用Java编写的JVM字节码解释器

    历史2009年,我在周末有一些空闲时间,决定尝试使用纯Java开发小型JVM解释器,该解释器可在J2ME CLDC 1.0平台中使用,因为该平台不支持ClassLoader,但是加载已编译的类文件非常有用通过网络并执行它们。 “概念验证...

    java虚拟机2021面试题第二季

    4. 类加载和链接:JVM通过类加载器负责将字节码加载到内存中,并进行链接和初始化。类加载器还支持动态类加载和运行时扩展。 5. JIT编译:JVM还具备即时编译(Just-In-Time Compilation)的能力,它可以根据运行时...

    java虚拟机2021面试题第三季

    4. 类加载和链接:JVM通过类加载器负责将字节码加载到内存中,并进行链接和初始化。类加载器还支持动态类加载和运行时扩展。 5. JIT编译:JVM还具备即时编译(Just-In-Time Compilation)的能力,它可以根据运行时...

    JAVA_API1.6文档(中文)

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

Global site tag (gtag.js) - Google Analytics