类加载器在加载一个类的时候,先查看该类是否己经加载了(loadClass方法里面的逻辑),如果没有,那么就由父类去找,如果到了最顶层类加载器还没找到,就从顶层类加载器开始加载那个类,加载不成功的话就由下一层的类接着加载
注意下面的强制转化(最下面的( Parent )sonCl.newInstance()):
在代码A执行时不报错,在找码B执行时报错
原因:
在方法内,默认由AppClassLoader加载类,在B执行时,Parent代表的是AppClassLoader下的Parent(使用一个类时,默认由线程类加载器加载对应的类,默认为AppClassLoader,下面居然有用自定义类加载器加载Parent,但是在强制转化时的Parent是当前线程类加载器中查找Parent的,很显然找不到),Son与Parent由匿名类加载器加载,sonClass生成的对象的父类是匿名加载器下的,它在查找父类时,findLoadedClass直
接就能找到,众所周知,方法区内由类加载器与类本身共同标识一个Class对象,可以明显的看到这两个Class根本不同,
所在报错
要解决问题很容易,只要让匿名类加载器能找到AppClassLoader加载的Parent.class即可,而这个匿名类默认是
AppClassLoader的子类,而子类加载器找类时是从下到上(找父类加载器)找的,如果让AppClassLoader来加载
Parent问题就没了
ClassLoader cl = new ClassLoader() { public Class<?> loadClass(String name) throws ClassNotFoundException { String fileName = name.substring( name.lastIndexOf(".") + 1 ) + ".class"; InputStream is = getClass().getResourceAsStream( fileName ); // if( is == null || fileName.equals("Parent.class" ) )//A if( is == null )//B { return super.loadClass(name); } byte[] bt; try { bt = new byte[is.available()]; is.read(bt); return defineClass(name, bt, 0, bt.length ); } catch (IOException e) { e.printStackTrace(); } return super.loadClass(name); } }; Class ParentCl = cl.loadClass("org.gerry.classLoader.Parent"); Class sonCl = cl.loadClass("org.gerry.classLoader.Son");//它也会倒致ParentCl的加载, System.out.println( ( Parent )sonCl.newInstance() );
相关推荐
Java的类加载器体系采用的是双亲委派模型,这意味着当一个类加载器接收到加载类的请求时,它会首先将任务委托给父类加载器,只有当父类加载器无法找到该类时,子类加载器才会尝试自己加载。 其次,自定义类加载器是...
Java 类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的.class文件从文件系统或网络中加载到内存中,并将其转换为运行时的类对象。类加载器的这种动态加载机制为Java提供了极高的灵活性,使得程序可以在运行...
- **应用类加载器(Application ClassLoader)**:也称为系统类加载器,负责加载用户类路径(ClassPath)所指定的类。 **1.2 双亲委派模型** Java类加载器采用双亲委派模型,其流程如下: 1. 如果一个类加载器收到...
3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,它是ClassLoader类的默认实例,主要负责加载当前应用程序的类路径(ClassPath)所指定的jar或类文件。开发者可以创建自己的类加载器继承...
Java 类加载器是Java虚拟机(JVM)的关键组成部分,它们负责在运行时动态加载所需的类。类加载器基于三个核心机制:委托、可见性和单一性。 1. **委托机制**: - 当一个类加载器收到加载类的请求时,它首先不会...
JVM的类加载器(ClassLoader)负责将编译后的`.class`文件加载到内存中,为程序执行做好准备。当类被加载时,JVM会在内存的运行时数据区的方法区内存储类的信息,并在堆中创建一个`java.lang.Class`对象来封装这些...
综上所述,这份Java读书笔记可能涵盖了JVM的工作原理,特别是类的加载和执行过程,以及this关键字在代码中的应用。通过阅读Execution.htm和初始化总结this关键字.ppt,读者可以深化对Java程序执行流程和对象初始化的...
5. **类加载器**:系统类加载器、扩展类加载器和应用程序类加载器之间的双亲委派模型,以及自定义类加载器的实现。 6. **JVM调优**:通过调整JVM参数,如-Xms、-Xmx设置堆大小,-XX:NewRatio设定新生代与老年代比例...
火狐浏览器不支持有道云笔记网页版的问题可能是由于浏览器兼容性、JavaScript 文件加载、样式表加载或浏览器插件问题引起的。用户可以尝试使用其他浏览器、禁用浏览器插件或使用客户端软件来解决问题。
类加载机制遵循双亲委派模型,即当一个类加载器收到加载类的请求时,它首先会委托父类加载器尝试加载,只有当父类加载器无法加载时,子类加载器才会尝试加载。这样可以避免类的重复加载,保证核心类库的唯一性。 4...
在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...
这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...
根据提供的文件信息,这里将对Java学习笔记中的关键知识点进行详细阐述,主要涉及Java语言的基础概念、面向对象编程思想的应用以及Java类加载器的工作原理等内容。 ### Java学习基础 Java是一种广泛使用的高级编程...
这个过程包括配置内核选项、编译源码、安装内核模块和更新引导加载器。 7. **鸟哥私房菜Linux**:这是一本广受欢迎的Linux入门书籍,涵盖了Linux系统的方方面面,从基本命令到系统管理,适合初学者和有经验的管理员...
### 连接器和加载器基础知识 #### 1. 连接器和加载器功能概述 连接器和加载器是计算机程序构建过程中不可或缺的两个部分。连接器(Linker)负责将编译后的代码模块(通常是对象文件)合并成一个可执行文件。加载器...
类装载器分为启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(AppClassLoader),以及用户自定义的类加载器。 2. 运行时数据区:包括方法区(Method Area)、...
【张孝祥J2SE加强自学笔记(48-56)】主要涵盖了类加载器、代理类和动态类创建等Java核心知识点。 48、类加载器的问题实验分析: 在Java中,类加载器是负责查找并加载类的机制。在Web应用中,有多种类加载器,如...
类加载器之间的继承关系遵循着“父委托模型”,即一个类加载器在加载类之前会先委托给父类加载器尝试加载,只有当父类加载器无法加载时,才会自行加载。 通过上述分析,我们可以看到JVM是如何通过类加载子系统来...
文件可能包含了类加载器的工作机制、双亲委派模型、自定义类加载器的实现以及类加载过程中的加载、验证、准备、解析和初始化等步骤。 4. **webmagic的设计机制及原理-如何开发一个Java爬虫.html**:WebMagic是一个...