java7:核心技术与最佳实践读书笔记——类加载
流程:class -> 加载 -> jvm虚拟机 -> 链接 。
public void loadClass() throws Exception{
ClassLoader current = getClass().getClassLoader();
Class<?> clazz = current.loadClass("java.lang.String");
Object str = clazz.newInstance();
System.out.println(str.getClass());// java.lang.String
}
- 启动类加载器:原生代码实现
- 用户自定义的类加载器:继承自ClassLoader类
- Java平台默认提供
- 扩展类加载器:从特定的路径加载Java平台的扩展库
- 系统类加载器(应用类加载器):根据应用程序的类路径(ClassPath)来加载Java类(默认加载器)
- 程序中创建
public class School{
private Teacher t;
}
//某个类加载器对象加载School类时,Teacher类也将被加载,
//则这个类加载器是是School的定义类加载器和初始类加载器,
//但它只是Teacher的初始类加载器。
public void displayParents(){
ClassLoader current = getClass().getClassLoader();
while(current != null){
System.out.println(current.toString());
current = current.getParent();
}
}
//result:
//sun.misc.Launcher$AppClassLoader@177b3cd(系统类加载器)
//sun.misc.Launcher$ExtClassLoader@1bd7848(拓展类加载器)
//null,代表启动类加载
- 默认实现流程:
- findLoadedClass方法查找Java类是否被加载过,如果被加载则直接返回已加载的Class对象。
- getParent方法获取双亲类加载器对象,调用双亲类加载器的loadClass方法,若getParent为null,则使用启动类加载来进行加载(代理模式生效的地方,代理给双亲类加载器来处理)。
- 由当前类加载器通过findClass方法来进行查找。
- 若上面都找不到就抛出java.lang.ClassNotFoundException异常。
- 如果loadClass方法第二个参数设置为true,即需要对找到的类进行链接操作,则loadClass方法会调用resolveClass方法进行链接。
package classloader;
public class Sample {
private String name = "andy";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} package classloader;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileSystemClassLoader extends ClassLoader {
private Path path; public FileSystemClassLoader(Path path) {
this.path = path;
} protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] classData = getClassData(name);
return defineClass(name, classData, 0, classData.length);
} catch (IOException e) {
throw new ClassNotFoundException();
}
} private byte[] getClassData(String className) throws IOException {
Path classFilePath = classNameToPath(className);
return Files.readAllBytes(classFilePath);
} private Path classNameToPath(String className) {
return path.resolve(className.replace('.', File.separatorChar)
+ ".class");
} public static void main(String[] args) throws Exception {
Path path = Paths.get("E:/project/eclipse_J2EE/java-test/bin/");
FileSystemClassLoader classLoader = new FileSystemClassLoader(path);
Class<?> clazz = classLoader.findClass("classloader.Sample");
Object object = clazz.newInstance();
Method method = clazz.getMethod("getName");
String name =(String)method.invoke(object);
System.out.println(name);
}
} //result:
//andy
public interface Versionized{
String getVersion();
} public Service implements Versionized{
}
//版本1 编译产生的serviceV1.class保留
//版本2 编译产生新的serviceV2.calss
//放在同一个目录下,使用FileSystemClassLoader来读取 public class ServiceFactory{
public static versionized getService(String className ,String version) throws Exception{
Path path = Paths.get("service",version);
FileSystemClassLoader loader = new FileSystemClssLoader(path);
Class<?> clazz = loader.loadClass(className);
return (Versionized)clazz.newInstance();
}
}
//使用
public class ServiceConsumer{
public void consume()throws Exception{
String serviceName = "xxx.xxx.SampleService";
Versionized v1 = ServiceFactory.getService(serviceName,"v1");
Versionized v2 = ServiceFactory.getService(serviceName,"v2");
}
}
- 创建新的ClassLoader类的对象
- 加载当前Java类的ClassLoader类的对象
- 使用Java平台提供的系统类加载器或者扩展类加载器
- public static Class<?> forName(String name,boolean initialize, ClassLoader loader)//Java类名、初始化Java类、加载Java类的类加载器对象
- public static Class<?> forName(String name) // true、this.getClass().getClassLoader()
//config.properties
mode = debug //LoadResoource.java
public Properties loadConfig() throws IOException {
ClassLoader loader = this.getClass().getClassLoader();
InputStream input = loader
.getResourceAsStream("classloader/config.properties");
if (input == null) {
throw new IOException("找不到配置文件。");
}
Properties props = new Properties();
props.load(input);
return props;
} public static void main(String[] args) throws IOException {
LoadResource lr = new LoadResource();
Properties props = lr.loadConfig();
System.out.println(props.getProperty("mode"));//debug
}
java7:核心技术与最佳实践读书笔记——类加载的更多相关文章
- java7:核心技术与最佳实践读书笔记——对象生命周期
流程:字节码文件(.class) -> 类加载 -> 类链接 -> 类初始化 -> 对象初始化 -> 对象创建 -> 对象使用 -> 对象回收 . 1.Jav ...
- java7:核心技术与最佳实践读书笔记——字节代码格式
一般流程:开发人员写出java源代码(.java) -> javac(编译器) -> java字节代码(.class) -> 加载 -> java虚拟机(jvm)运行. 1. ...
- 《深入理解Java7核心技术与最佳实践》读书笔记(1.1)---Project Coin介绍
OpenJDK中的Coin项目(Project Coin)的目的就是为了收集对Java语言的语法进行增强的建议.在Coin项目开始之初,曾经广泛地向社区征求提议.在短短的一个月时间内就收到将近70条提 ...
- php核心技术与最佳实践(笔记一)
1.1面向对象的型与本 类是对象的抽象组织,对象是类的具体存在. 1.1.1对象的形 <?php class Person{ public $name; public $gender; publ ...
- PHP核心技术与最佳实践——全局浏览
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
- 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld
<深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...
- 温习《PHP 核心技术与最佳实践》这本书
再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2 ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...
- 《C+编程规范 101条规则、准则与最佳实践》笔记
<C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...
随机推荐
- Geth安装和使用
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011680118/article/details/82378509 一.简介 Geth是Go ...
- Mac下持续集成-Jenkins权限设置
部署上后集成Jmeter玩了一晚上,后来发现账号登录不进去了,
- 树莓派根分区扩展至整张sd卡
第一步,安装raspi-config sudo apt-get install raspi-config 第二步,运行raspi-config sudo raspi-config 界面选择,Expan ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_19-CMS前端页面查询开发-页面原型-Table组件测试
页面填充内容.用一个表格来显示内容 3.1.2.1 Element-UI介绍 本项目使用Element-UI来构建界面,Element是一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的桌面 ...
- [ML] Linear Discriminant Analysis
虽然名字里有discriminat这个字,但却是生成模型,有点意思. 判别式 pk 生成式 阅读:生成方法 vs 判别方法 + 生成模型 vs 判别模型 举例: 判别式模型举例:要确定一个羊是山羊还是 ...
- git clone https://chromium.googlesource.com/失败
一.现象 连接着vpn,网页上可以直接打开网站,但是使用terminal 执行git clone https://chromium.googlesource.com/xxxx时, 报错 ...
- 找回Firefox4的状态栏!Status-4-Evar扩展
Status-4-Evar这个扩展能让Firefox4故意移除的状态栏给找回来!官方下载地址为:https://addons.mozilla.org/zh-CN/firefox/addon/23528 ...
- centos安装软件
rpm指令, 该指令安装文件后缀.rpm的可执行程序 yum指令 安装软件源代码,后缀为 .tar.gz(用gzip压缩过的tar包) rpm rpm软件包格式为 (一)查询系统装已经安装的软件信息 ...
- Cocos Creator 中的动作系统那些事儿
动作系统就是可以在一定的时间内实现位移.旋转.缩放.跳动等各种动作. 需要注意的是,动作系统跟 Cocos Creator 编译器的动画系统不同,动作系统是面向程序员的API接口,而动画系统是通过编译 ...
- cocos2dx图片加密解密(npk方式)
话不多说,直接开始: 准备的工具: 链接:https://pan.baidu.com/s/1Om4kBNWcG2jL_RTsHqqzpQ 提取码:bv7i npkCreate.exe是加密图片的工具, ...