`
smiky
  • 浏览: 254175 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

类加载器笔记

阅读更多

 

类加载器在加载一个类的时候,先查看该类是否己经加载了(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加载原理教程后,写了这个自己的类加载器,作个笔记,以便以且使用

    黑马程序员------类加载器学习注意点

    NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901

    java 类加载器学习笔记1

    /** * java类加载器 * 类加载器负责加载与连接,这个过程是在运行时进行的,这种机制为java提供极大的灵活性 * * 类的生命周期 * class文件

    java基础学习笔记之类加载器

    java中的类加载器:java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以...

    JVM学习笔记(一)——类的加载机制

    ​ 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动...

    Maven笔记Maven笔记Maven笔记

    2.2: boot:含有plexus-classworlds类加载器框架 2.3: conf:含有settings.xml配置文件针对所有用户都有效果, ~/.m2/setting.xml对于单个用户的 3.3: lib: 含有Maven运行时所需要的java类库 Maven的约定(约定...

    连接器和加载器beta2.pdf

    这是一本介绍连接器和加载器的文章,比较底层,但对于提高操作系统级别编程的朋友特别有好处.

    Java学习笔记

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

    java基础学习总结笔记

    Java基础常识、如何安装Java工具、Java语言的基础组成、Java面向对象、Java多线程、Java常用类、集合(重点)、IO流、GUI图形界面、网络编程、正则表达式、反射、注解、类加载器、动态代理等等,另外还包括银行管理...

    day020-继承加强和设计模式代码和笔记.rar

    由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用, 所以 不允许直接通过引用进行操作。 2. 拓展类加载器(Extension classLoader): 扩展类加载器是...

    Java基础全程学习笔记

    Java基础全程学习笔记,很早之前的学习笔记,补充发布。 从基础语法开始到类加载器、反射、模块化内容PDF形式发布

    【隐匿的学习笔记】JVM(1) 类加载子系统

    类的加载器和加载过程 其实就是JVM运行的第一步 讲class文件加载的过程 这个过程分为三步 加载 链接 初始化 也就是简图中的第一步 加载load 加载都做了什么? 1.通过类的全限定名获取定义此类的二进制字节流 ----&gt...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    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自学笔记.txt

    %Maven_HOME%\bin echo %M3_HOME% 连接符号:软链接实际上就是一个指向文件的指针 ...Boot 类加载器框架 conf 分为全局与用户配置 超级POM 在lib文件中 License.txt 软件的使用许可 NOTICE.txt 第三方的软件

    JVM性学习笔记-基本原理,内存模型,JVM参数

    JVM性学习笔记-基本原理,内存模型,JVM参数设置,类加载器原理,JDK自带工具

    RGB Blod三原色加载器CSS3特效.rar

    RGB Blod三原色加载器CSS3特效.rar

    wp-namespace-autoloader:一个PHP自动加载器类,该类遵循适用于PSR-4规范的WordPress编码标准

    一个PHP自动加载器类,该类遵循适用于PSR-4规范的WordPress编码标准 描述 命名空间和自动加载器很酷,可以帮助组织代码。 有了这些功能,您不必担心再次手动包含和要求php文件,并且您的代码可以组织在文件夹中。 ...

    J2SE笔记讲解个人修订(1.1).docx

    14 JAVA类加载器CLASSLOADER 15 JAVA简单工厂模式 16 JAVA中的注解 17 JAVA 图形界面 18 JAVA多线程 19 JAVA 反射机制 20 JAVA克隆CLONE(复制) 21 JAVA 网络编程 22 JAVA 其他未归类 23 JNI概述

Global site tag (gtag.js) - Google Analytics