java 类加载器-基础

  • 类加载机制
  • 类加载器的双亲委托机制
  • 自定义类加载路径
  • 自定义类加载器

类加载机制

  • 类加载器ClassLoader。
    – 负责查找,加载,校验字节码的应用程序。

java.lang.ClassLoader主要方法:

  1. load(String className),根据名字加载一个类。
  2. defineClass(String name, byte[] b, int off, int len),将一个字节流定义为一个类。
  3. findClass(String name),查找一个类。
  4. findLoadedClass(String name),在已加载的类中,查找一个类。
  5. 成员变量ClassLoader parent。
  • JVM的四级类加载器。
  1. 启动类加载器(Bootstrap),加载系统类tr.jar。
  2. 扩展类加载器(Extension),jre/lib/ext、
  3. 应用类加载器(App),classpath。
  4. 用户定义加载器(Plugin)。

类加载器的双亲委托机制

java严格遵守双亲委托机制。

  1. 首先判断是否已经加载。
  2. 若无,找父加载器加载。
  3. 若再无,由当前加载器加载。
  • 类会由最顶层的类加载器来加载,如果没有,则由当前类加载器加载。
  • 委托是单向的,即只有下级类加载器加载的类可以访问上级类加载器加载的类。
  • 双亲委托的补充:
    – 执行java程序,添加虚拟机参数-Xbootclasspath/a:<path>,将类路径配置为Bootstrap等级。该类将会被JVM优先加载。

自定义类加载路径

  • 自定义类加载路径:
    – 弥补类搜索路径静态的不足。
    – 前3个加载的路径在运行前已经确定。
    – java提供URLClassLoader使得程序运行时可以修改类的加载路径。

  • URLClassLoader
    – 继承于ClassLoader。
    – 程序运行时可以修改类的加载路径。
    – 可已从多个来源中加载类:目录,jar包,网络。

该类有两个构造函数。

URLClassLoader(URL[] urls);
//使用默认的父加载器加载给定的URLClassLoader对象。
URLClassLoader(URL[] urls, ClassLoader parent);
//利用给定的类加载器创建URLClassLoader对象。

自定义类加载器

  • 继承ClassLoader类。
  • 重写findClass(String className)方法。

例如:用project2下的myClassLoader类去加载project1下的hello类,并调用其say方法。
project1:

public class hello{public void say(){System.out.println("hello"); }
}

project2:

public class myClassLoader extends ClassLader{public class<?> findClass(String name)throws ClassNotFoundException{byte[] classBytes = null;classBytes = loadClassBytes(name);//调用defineClass产生一个类,并在VM中注册。Class<?> c = defineClass(name, classBytes, 0, classBytes.length);if(c == null) throw new ClassNotFoundException(name);return c;}private byte loadClassBytes(name){String cname = "paths/hello.class";byte[] bytes = Files.readAllBytes(cname);return bytes;}
}
public class Test{public static void main(String[] args) throws Exception{ClassLoader classloader  = new myClassLoader();//调用loadClass去加载hello。//loadClass是ClassLoader的默认方法,采用双亲原则加载类。//loadClass找不到,就会调用findClass找。Class<?> c = classloader.loadClass("hello");Method m = c.getMethod("say");Object obj = c.newInstance();m.invoke(obj);System.out.println(c.getClassLoader().getClass().getName()); }
}

输出结果:

hello
myClassLoader

java 类加载器-基础相关推荐

  1. java类加载器正确的是_Java面试题:面向对象,类加载器,JDBC, Spring 基础概念

    1. 为什么说Java是一门平台无关语言? 平台无关实际的含义是"一次编写到处运行".Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无 ...

  2. java类加载器_类加载器

    回顾一下类加载过程 类加载过程:加载->连接->初始化.连接过程又可分为三步:验证->准备->解析. 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的 ...

  3. Java类加载器( 死磕9)

    [正文]Java类加载器(  CLassLoader ) 死磕9:  上下文加载器原理和案例 本小节目录 9.1. 父加载器不能访问子加载器的类 9.2. 一个宠物工厂接口 9.3. 一个宠物工厂管理 ...

  4. java 类加载器的理解及加载机制?

    通过 java 命令运行 java 程序的步骤就是指定包含 main 方法的完整类名以及一个 classpath 类路径,类路径可以有多个,对于直接的 class 文件路径就是 class 文件的根目 ...

  5. [Java类加载器]Java中classLoader浅析.

    [Java类加载器]Java中classLoader浅析. 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclips ...

  6. 一篇文章读懂Java类加载器

    Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上 ...

  7. 深入探讨 Java 类加载器

    深入探讨 Java 类加载器 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加 ...

  8. 80070583类不存在_结合JVM源码谈Java类加载器

    一.前言 之前文章 加多:ClassLoader解惑​zhuanlan.zhihu.com 从Java层面讲解了Java类加载器的原理,这里我们结合JVM源码在稍微深入讲解下. 二.Java类加载器的 ...

  9. java 类加载器 解密_JAVA类加载器总结整理

    一.What(是什么?) 1.概念 Java类加载器是Java运行时环境的一部分,负责动态加载Java类到JVM的内存空间中.每个Java类必须由某个类加载器装入到内存中.每一个类加载器都有一个父类加 ...

最新文章

  1. httpclient3.1的多线程处理
  2. Android批量打包 如何一秒内打完几百个apk渠道包
  3. 【Android】launcher启动参数
  4. java接口有非抽象方法_如果一个类没有实现Java接口的所有抽象方法,会发生什么?...
  5. 7-3 寻找大富翁 (25 分)
  6. 整数反转Java_详解 LeetCode_007_整数反转(Java 实现)
  7. 3款强大的BootStrap的可视化制作工具推荐
  8. Flask 与 Django 框架对比
  9. Project Tungsten:将Apache Spark更接近裸机
  10. 仿9GAG制作过程(五)
  11. 微博研发实习阶段性总结及知识点整理
  12. SAP 金额等负号提前问题
  13. 如何配置一台电脑。(一次解决电脑基础知识和如何选择合适电脑)
  14. 计算机的数学知识的手抄报图片大全,数学知识手抄报图片大全
  15. js正则贪婪模式_js 正则表达式问题 贪婪与非贪婪
  16. 新版Win10开机任务栏卡死的原因和解决方法
  17. 智能驾驶软件测试,智能驾驶实车测试系统-VDAS
  18. 怎么理解CRM客户关系管理系统?
  19. 如何下载某个网站的ico图标
  20. 飞扬的小鸟JavaScript实现

热门文章

  1. 按需要生成你的网站导航栏
  2. Repeater内部排序
  3. 【HNOI2017】礼物
  4. 开源软件free download manager在windows defender中报毒
  5. 关于JAVA的一道面试题
  6. java赋值父类_java新手求助super和set给父类赋值!
  7. 贪心——雪糕的最大数量(Leetcode 1833)
  8. java正则表达 w,超强变态的正则(\w)((?=\1\1\1)(\1))+讲解
  9. 量化信噪比 非均匀量化_键摄基础1:为什么要正确曝光/ADC精度和量化噪声
  10. 首期openGauss训练营结营,48个FAQ和全部PPT通通给你,随附62人结营学员名单