java 类加载器-基础
java 类加载器-基础
- 类加载机制
- 类加载器的双亲委托机制
- 自定义类加载路径
- 自定义类加载器
类加载机制
- 类加载器ClassLoader。
– 负责查找,加载,校验字节码的应用程序。
– java.lang.ClassLoader主要方法:
- load(String className),根据名字加载一个类。
- defineClass(String name, byte[] b, int off, int len),将一个字节流定义为一个类。
- findClass(String name),查找一个类。
- findLoadedClass(String name),在已加载的类中,查找一个类。
- 成员变量ClassLoader parent。
- JVM的四级类加载器。
- 启动类加载器(Bootstrap),加载系统类tr.jar。
- 扩展类加载器(Extension),jre/lib/ext、
- 应用类加载器(App),classpath。
- 用户定义加载器(Plugin)。
类加载器的双亲委托机制
java严格遵守双亲委托机制。
- 首先判断是否已经加载。
- 若无,找父加载器加载。
- 若再无,由当前加载器加载。
- 类会由最顶层的类加载器来加载,如果没有,则由当前类加载器加载。
- 委托是单向的,即只有下级类加载器加载的类可以访问上级类加载器加载的类。
- 双亲委托的补充:
– 执行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 类加载器-基础相关推荐
- java类加载器正确的是_Java面试题:面向对象,类加载器,JDBC, Spring 基础概念
1. 为什么说Java是一门平台无关语言? 平台无关实际的含义是"一次编写到处运行".Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无 ...
- java类加载器_类加载器
回顾一下类加载过程 类加载过程:加载->连接->初始化.连接过程又可分为三步:验证->准备->解析. 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的 ...
- Java类加载器( 死磕9)
[正文]Java类加载器( CLassLoader ) 死磕9: 上下文加载器原理和案例 本小节目录 9.1. 父加载器不能访问子加载器的类 9.2. 一个宠物工厂接口 9.3. 一个宠物工厂管理 ...
- java 类加载器的理解及加载机制?
通过 java 命令运行 java 程序的步骤就是指定包含 main 方法的完整类名以及一个 classpath 类路径,类路径可以有多个,对于直接的 class 文件路径就是 class 文件的根目 ...
- [Java类加载器]Java中classLoader浅析.
[Java类加载器]Java中classLoader浅析. 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclips ...
- 一篇文章读懂Java类加载器
Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上 ...
- 深入探讨 Java 类加载器
深入探讨 Java 类加载器 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加 ...
- 80070583类不存在_结合JVM源码谈Java类加载器
一.前言 之前文章 加多:ClassLoader解惑zhuanlan.zhihu.com 从Java层面讲解了Java类加载器的原理,这里我们结合JVM源码在稍微深入讲解下. 二.Java类加载器的 ...
- java 类加载器 解密_JAVA类加载器总结整理
一.What(是什么?) 1.概念 Java类加载器是Java运行时环境的一部分,负责动态加载Java类到JVM的内存空间中.每个Java类必须由某个类加载器装入到内存中.每一个类加载器都有一个父类加 ...
最新文章
- httpclient3.1的多线程处理
- Android批量打包 如何一秒内打完几百个apk渠道包
- 【Android】launcher启动参数
- java接口有非抽象方法_如果一个类没有实现Java接口的所有抽象方法,会发生什么?...
- 7-3 寻找大富翁 (25 分)
- 整数反转Java_详解 LeetCode_007_整数反转(Java 实现)
- 3款强大的BootStrap的可视化制作工具推荐
- Flask 与 Django 框架对比
- Project Tungsten:将Apache Spark更接近裸机
- 仿9GAG制作过程(五)
- 微博研发实习阶段性总结及知识点整理
- SAP 金额等负号提前问题
- 如何配置一台电脑。(一次解决电脑基础知识和如何选择合适电脑)
- 计算机的数学知识的手抄报图片大全,数学知识手抄报图片大全
- js正则贪婪模式_js 正则表达式问题 贪婪与非贪婪
- 新版Win10开机任务栏卡死的原因和解决方法
- 智能驾驶软件测试,智能驾驶实车测试系统-VDAS
- 怎么理解CRM客户关系管理系统?
- 如何下载某个网站的ico图标
- 飞扬的小鸟JavaScript实现
热门文章
- 按需要生成你的网站导航栏
- Repeater内部排序
- 【HNOI2017】礼物
- 开源软件free download manager在windows defender中报毒
- 关于JAVA的一道面试题
- java赋值父类_java新手求助super和set给父类赋值!
- 贪心——雪糕的最大数量(Leetcode 1833)
- java正则表达 w,超强变态的正则(\w)((?=\1\1\1)(\1))+讲解
- 量化信噪比 非均匀量化_键摄基础1:为什么要正确曝光/ADC精度和量化噪声
- 首期openGauss训练营结营,48个FAQ和全部PPT通通给你,随附62人结营学员名单