五、ClassLoader

1.什么是ClassLoader

2.四种ClassLoader

3.自定义CLassLoader

(1)MyClassLoader

  1. public class MyClassLoader extends ClassLoader {
  2. private String path;
  3. private String classLoaderName;
  4.  
  5. public MyClassLoader(String path, String classLoaderName) {
  6. this.path = path;
  7. this.classLoaderName = classLoaderName;
  8. }
  9.  
  10. //用于寻找类文件
  11. @Override
  12. public Class findClass(String name) {
  13. byte[] b = loadClassData(name);
  14. return defineClass(name, b, 0, b.length);
  15. }
  16.  
  17. //用于加载类文件
  18. private byte[] loadClassData(String name) {
  19. name = path + name + ".class";
  20. InputStream in = null;
  21. ByteArrayOutputStream out = null;
  22. try {
  23. in = new FileInputStream(new File(name));
  24. out = new ByteArrayOutputStream();
  25. int i = 0;
  26. while ((i = in.read()) != -1) {
  27. out.write(i);
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. } finally {
  32. try {
  33. out.close();
  34. in.close();
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. return out.toByteArray();
  40. }
  41. }

原理还是通过ClassLoader中的deFineClass方法来获取Class类型对象,自定义的是路径

(2)实现ClassLoaderChecker

  1. public class ClassLoaderChecker {
  2. public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
  3. MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader");
  4. Class c = m.loadClass("Wali");
  5. c.newInstance();
  6. }
  7. }

(3)实现效果

4.类加载器的双亲委派机制

为什么要使用双亲委派机制来加载class文件-避免多份同样的字节码的加载

5.类的加载方式

隐式加载:new

显示加载:loadClass,formName

(1)类装载过程

(2)代码实例区别

  1. public class LoadDifference {
  2. public static void main(String[] args) throws Exception {
  3. //loadClass加载类,需要调用c.newInstance()才会加载类
  4. ClassLoader cl = Robot.class.getClassLoader();
  5. Class c = cl.loadClass("com.interview.javabasic.reflect.Robot");
  6. c.newInstance();
  7. //forName加载类,在加载类的时候会将Static静态代码块的代码实现出来
  8. Class r = Class.forName("com.interview.javabasic.reflect.Robot");
  9. }
  10. }

使用Class.forName(classname)才能在反射回去类的时候执行static块。(3)数据库链接为什么使用Class.forName(className)

JVM(五),ClassLoader的更多相关文章

  1. JVM的ClassLoader过程分析

    本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ...

  2. JVM和ClassLoader

    JVM和ClassLoader 2019-11-08 目录 1 JVM架构整体架构 1.1 类加载器子系统 1.1.1 加载 1.1.2 链接 1.1.3 初始化 1.2 运行时数据区(Runtime ...

  3. java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

    ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...

  4. JVM思考-ClassLoader.loadClasshe和Class.forName区别

    JVM思考-ClassLoader.loadClasshe和Class.forName区别 目录:JVM总括:目录 见博客第四节:JVM总括四-类加载过程.双亲委派模型.对象实例化过程

  5. JVM(五):探究类加载过程-上

    JVM(五):探究类加载过程-上 本文我们来研究一个Java字节码文件(Class文件)是如何加载入内存中的,在這個过程中涉及类加载过程中的加载,验证,准备,解析(连接),初始化,使用,销毁过程,并探 ...

  6. JVM 系列 ClassLoader

    JVM 系列()ClassLoader 在前面一节中,主要介绍了 Class 的装载过程,Class 的装载大体上可以分为加载类.连接类和初始化 3 个阶段.本小节将主要介绍绍 Java 语言中的 C ...

  7. JVM中ClassLoader的学习

    JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...

  8. JVM的classloader(转)

    Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存.    这四个类加载器分别为:Bootstrap ClassLoader.Extension Class ...

  9. 关于JVM的ClassLoader(转)

    众所周知,java是编译型的语言,写的是java文件,最后运行的是class文件,class文件是运行在JVM之中的,这时候就有一个问题,JVM如何装载class文件的?是通过ClassLoader来 ...

  10. 一步步优化JVM五:优化延迟或者响应时间(1)

    http://blog.csdn.net/zhoutao198712/article/details/7791969      本节的目标是做一些优化以满足对应用对延迟的需求.这次需要几个步骤,包括完 ...

随机推荐

  1. kali linux eth0网卡不见了上不了网

    不知道什么原因,我的虚拟机上的kali linux 下载了vsftpd重启后,就连不上网了 ifconfig后 发现eth0网卡不见了此时可以使用 ifconfig eth0 up 就可以使网卡重现但 ...

  2. Jmeter之Dummy Sampler

    Dummy Sampler(Dummy取样器) Dummy Sampler就像是一个模拟器,需要自己填入请求和响应的信息.(原理类似mock服务) 在没有服务的情况下,测试人员依据Dummy Samp ...

  3. 牛客 158D a-贝利福斯数

    将所有形如ax+1的数称为a-贝利福斯数,其中x是正整数.一个a-贝利福斯数是a-贝利福斯素数,当且仅当它不能被分解成两个a-贝利福斯数的积.现在给出a,n,问有多少个 ≤ n的a-贝利福斯数可以被分 ...

  4. Fonour.AspnetCore 生成SQL SERVER数据库

    Install-Package EntityFramework Add-Migration InitialCreate Update-Database

  5. Html-自适应

    自适应 使网页能适应不同终端设备的技术.原理是通过检测视口分辨率来判断是什么终端的,PC,手机还是平板. 做自适应的网页时,需要在代码中加入“祖传代码”,即通用代码. 这是在头部head引入的: &l ...

  6. Python中GUI库PyQt5的安装和配置

    在使用Tkinter开发GUI程序时,发现相关文档比较少,开发起来太累.经过综合比较,决定使用PyQt这个库.下面是简单的安装步骤. 1.安装 PyQt5 : pip install PyQt5 -i ...

  7. Springboot 测试类没有找到bean注入

    其他乱七八糟配置就不扯了,先上项目结构图 配置好参数后我再src/test/java类测试访问数据库时发现bean没有正确的注入.值得注意的是,这个项目的启动类是叫App.java 所以我们必须在这个 ...

  8. 在Python中,如何用一行代码去判定整数二进制中的连续 1

    利用字节位操作如何判断一个整数的二进制是否含有至少两个连续的1 的方法有多种,大家第一反应应该想到的是以下的第一种方法. 方法一:从头到尾遍历一遍每一位即可找出是否有连续的1存在 这个方法是最普遍的. ...

  9. 四、Attribute(2)授权角色过滤器

    一.授权过滤器 1.新建一个mvc 项目 2.首先创建一个过滤器 MyAuthorizeAttribute 继承AuthorizeAttribute,并重写 AuthorizeCore public ...

  10. Percona MongoDB 4 搭建副本集

    什么是副本集: 是一组维护相同数据集的mongod进程 提供冗余,自动故障转移和高可用性 提供读取可伸缩性 内部概念或多或少与MySQL的概念相似 PRIMARY概念与MySQL复制中的MASTER大 ...