类加载器在加载一个类的时候,先查看该类是否己经加载了(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加载原理教程后,写了这个自己的类加载器,作个笔记,以便以且使用
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901
/** * java类加载器 * 类加载器负责加载与连接,这个过程是在运行时进行的,这种机制为java提供极大的灵活性 * * 类的生命周期 * class文件
java中的类加载器:java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以...
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动...
2.2: boot:含有plexus-classworlds类加载器框架 2.3: conf:含有settings.xml配置文件针对所有用户都有效果, ~/.m2/setting.xml对于单个用户的 3.3: lib: 含有Maven运行时所需要的java类库 Maven的约定(约定...
这是一本介绍连接器和加载器的文章,比较底层,但对于提高操作系统级别编程的朋友特别有好处.
类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 健壮 3.面向对象 面向过程: 程序:函数+变量 (算法+数据结构) 面向对象: 如:SmallTalk 程序:对象和对象相互之间的“通讯” ...
Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多线程、Java常用类、集合(重点)、IO流、GUI图形界面、网络编程、正则表达式、反射、注解、类加载器、动态代理等等,另外还包括银行管理...
由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用, 所以 不允许直接通过引用进行操作。 2. 拓展类加载器(Extension classLoader): 扩展类加载器是...
Java基础全程学习笔记,很早之前的学习笔记,补充发布。 从基础语法开始到类加载器、反射、模块化内容PDF形式发布
类的加载器和加载过程 其实就是JVM运行的第一步 讲class文件加载的过程 这个过程分为三步 加载 链接 初始化 也就是简图中的第一步 加载load 加载都做了什么? 1.通过类的全限定名获取定义此类的二进制字节流 ---->...
15.2.1 类加载器层级架构 515 15.2.2 建立classloader实例 518 15.3 重点复习 520 15.4 课后练习 521 chapter16 自定义泛型、枚举与标注 523 16.1 自定义泛型 524 16.1.1 定义泛型方法 524 16.1.2 ...
%Maven_HOME%\bin echo %M3_HOME% 连接符号:软链接实际上就是一个指向文件的指针 ...Boot 类加载器框架 conf 分为全局与用户配置 超级POM 在lib文件中 License.txt 软件的使用许可 NOTICE.txt 第三方的软件
JVM性学习笔记-基本原理,内存模型,JVM参数设置,类加载器原理,JDK自带工具
RGB Blod三原色加载器CSS3特效.rar
一个PHP自动加载器类,该类遵循适用于PSR-4规范的WordPress编码标准 描述 命名空间和自动加载器很酷,可以帮助组织代码。 有了这些功能,您不必担心再次手动包含和要求php文件,并且您的代码可以组织在文件夹中。 ...
14 JAVA类加载器CLASSLOADER 15 JAVA简单工厂模式 16 JAVA中的注解 17 JAVA 图形界面 18 JAVA多线程 19 JAVA 反射机制 20 JAVA克隆CLONE(复制) 21 JAVA 网络编程 22 JAVA 其他未归类 23 JNI概述