自定义类加载器

2023-11-11

/**
 * 
 */
package com.bzu.csh;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * 
 * 项目名称:Test1 类名称:Test2 类描述: 创建人:admin 创建时间:2017年1月7日 下午9:41:36 修改人:admin
 * 修改时间:2017年1月7日 下午9:41:36 修改备注:
 * 
 * @version
 * 
 */

public class MyClassLoader extends ClassLoader {

	private String name;
	private String path = "d:\\";
	private final String fileType = ".class";

	public MyClassLoader(String name) {
		super();// system加载器为父加载器
		this.name = name;
	}

	public MyClassLoader(ClassLoader parent, String name) {
		super(parent);// 显示指定该类加载器的父加载器
		this.name = name;
	}

	/**
	 * ClassLoader API中找到的
	 */
	public Class<?> findClass(String name) {
		byte[] b = loadClassData(name);
		return defineClass("com.bzu.csh." + name, b, 0, b.length);
	}

	private byte[] loadClassData(String name) {
		InputStream is = null;
		byte[] data = null;
		ByteArrayOutputStream baos = null;
		try {
			// 转换. --> /
			this.name = this.name.replace(".", "/");
			is = new FileInputStream(new File(path + name + fileType));
			baos = new ByteArrayOutputStream();
			int ch = 0;
			while (-1 != (ch = is.read())) {
				baos.write(ch);
			}
			data = baos.toByteArray();
		} catch (Exception e) {

		} finally {
			try {
				is.close();
				baos.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
		return data;
	}

	public static void main(String[] args) throws Exception {
		MyClassLoader loader = new MyClassLoader("loader1");// 父加载器为sysout加载器
		loader.setPath("d:\\myapp\\myclass\\");
		MyClassLoader loader1 = new MyClassLoader(loader, "loader1");// 父加载器器为loader
		loader1.setPath("d:\\myapp\\myclass\\");
		MyClassLoader loader2 = new MyClassLoader(null, "loader2");// 父加载器为bootstrap加载器
		loader2.setPath("d:\\myapp\\myclass\\");
		// test(loader);
		// test(loader1);
		test(loader2);
	}

	public static void test(ClassLoader loader) throws InstantiationException,
			IllegalAccessException, ClassNotFoundException {
		Class clazz = loader.loadClass("Sample");
		Object instance = clazz.newInstance();
	}

	@Override
	public String toString() {
		return this.name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public String getFileType() {
		return fileType;
	}
}

/**
 * 
 */
package com.bzu.csh;

/**
 * 
 * 项目名称:Test1 类名称:Sample 类描述: 创建人:admin 创建时间:2017年1月8日 下午3:31:16 修改人:admin
 * 修改时间:2017年1月8日 下午3:31:16 修改备注:
 * 
 * @version
 * 
 */
public class Sample {
	public int v1 = 1;

	public Sample() {
		System.out.println("Sample is loading"
				+ this.getClass().getClassLoader());
		
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义类加载器 的相关文章

随机推荐

  • GDAL-3.3.2编译

    前言 我的环境是win10 vs2019 gdal3 3 2 编译步骤 1 GDAL下载 1 GDAL下载地址 2 GEOS Geometry Engine Open Source 下载地址 3 PROJ8下载地址 注意 1 geos官网主
  • 【Xilinx AX7103 MicroBalze学习笔记4】MicroBlaze 按键中断实验

    目录 实验任务 实验框图 硬件设计 Vivado部分 Block Design 搭建 软件设计 SDK部分 代码部分 上板验证 往期系列博客 实验任务 通过 AXI GPIO 检测按键状态产生中断信号 中断控制器检测到中断后 给处理器发送中
  • 【C语言】—— 实现简易四则运算

    实现简易四则运算表达式 前言 在我们使用计算器进行简单的加减乘除运算的时候 需要注意很多问题 最重要的是乘除法的算数优先级和加减法是不同的 如果在一连串连续输入的时候 我们要如何做到正确解答问题呢 解题思路 在面对这个问题的时候 我首先想到
  • 埋点SDK原理与实现

    文章目录 埋点分析 一 埋点是什么 二 为什么要埋点 三 怎么做埋点 举例Google Analytics服务提供的主要功能 四 埋点的实现原理 1 用户使用方式 1 全局注册 2 手动埋点 3 无埋点 2 实现原理 1 如
  • esp8266 at接收数据中断时间_C51编程18中断篇(串行通讯2)

    MCS 51单片机内部有两个独立的接收与发送SBUF 接收SBUF不能发送 发送SBUF不能接收 它们共用一个地址 99H 内部逻辑结构下图所示 在串行内部逻辑结构中可以看到 串行通信除了与SBUF有关外 还与串行口控制寄存器SCON 地址
  • PCL点云处理之读取与保存PLY文件(点云\网格)(一百五十四)

    PCL点云处理之读取与保存PLY文件 一百五十四 一 PLY文件介绍 二 读取内容 1 点云 2 网格 一 PLY文件介绍 在平常的工作学习 会接触到后缀名为 ply的文件 这是一种常用的存储点云或者网格数据的文件格式 我们可以通过一些方法
  • 两台(或多台)电脑怎么实现文件共享

    关于文件共享 总结了几种实现方式 大家可以根据自己的需求选择合适的共享方式 一 在同一个局域网内 无论是连接的WiFi还是网线 工作的需要 需要共享一些文件 1 找到需要共享的文件夹 或者文件 位置 如下图 比如需要共享 我的电脑的C盘 2
  • 【源码可分享】教你用Python制作自动答题脚本,实现自动答题,100%正确率!

    文章目录 前言 一 自动答题的原理 二 自动答题的步骤 三 Python实现自动答题的方法 总结 前言 当今社会 人们的生活越来越依赖于计算机技术 而Python作为一种高级编程语言 已经成为了众多程序员的首选语言 Python具有简单易学
  • 字符串解析

    知识点 1 split 方法用于把一个字符串分割成字符串数组 2 JSON stringify serilizeUrl sUrl 利用原生JSON对象 将对象转为字符串
  • 遇到DDos攻击勒索保护费,这该怎么办?

    经常会有遇到一些客户过来咨询自己遭到了网络攻击 对方勒索钱财 要是不给就会一直持续攻击下去 许多客户遇到这种情况 找到了德迅云安全询问这种情况有什么办法处理 首先遇到这种事情 这个是不能妥协的 不能助长违法行为 根据以往的经验 只要妥协一次
  • Linux下设置白名单sudo

    Linux下设置白名单sudo 普通账户权限不够 频繁切换root账户比较麻烦 我们可以把自己的普通账户添加到sudoers file中 这样我们可以使用sudo命令在普通用户下提升我们的权限 在root账户下 输入 vim etc sud
  • (论文加源码)基于deap的四分类脑电情绪识别(一维CNN+LSTM和一维CNN+GRU

    论文和源码见个人主页 https download csdn net download qq 45874683 85002721 论文加源码 基于DEAP数据集的1D CNN和RNN情感分类 GRU和LSTM 摘要 在这里 我们研究了脑电情
  • 远程桌面的端口号是多少?

    远程桌面 Remote Desktop 是一种用于远程访问和控制计算机的技术 它允许用户通过网络连接到远程计算机并以图形化界面进行操作 远程桌面使用的端口号通常是3389 在Windows操作系统中 远程桌面协议 Remote Deskto
  • 云服务器内存使用率多少合适,什么时候应当考虑升级主机内存

    根据mysql官方说法 服务器内存占用比例达80 时 属于高负载运行状态了 内存占用比例长时间超过80 时 属于很不稳定状态 长时间超过90 就进入风险区了 这时容易产生数据丢失 数据库崩塌等不安全现象 当然 内存使用率过低又有点资源浪费
  • Wolfram Mathematica 12.3免费安装教程

    注意 本文介绍的Wolfram Mathematica仅为学习用途 如果有条件请支持正版 本文参考自贴吧激活教程 有Github账号的可以点赞支持原作者 https github com TieBaMma InstallTutorial b
  • LVGL V8应用——通过按键切换页面

    一 按键切换对象 程序 全局变量 static lv obj t contanier1 NULL static lv obj t contanier2 NULL 按钮对应回调函数 实现容器的切换 static void win btn ev
  • mybatis-spring-boot-starter依赖对应关系表

    mybatis spring boot starter版本 spring boot starter版本 mybatis版本 mybatis spring版本 2 1 2 2 2 5 RELEASE 3 5 4 2 0 4 2 1 1 2 1
  • HP服务器换硬盘流程,HP服务器SSD硬盘更换操作指南.pptx

    HP服务器SSD硬盘更换操作指南 HP服务器SSD硬盘更换 操作指南 目录 硬盘的安装 准备工作 注意事项 磁盘阵列的创建 创建Raid的流程 注意事项 数据库的创建附加 准备工作 三星磁盘 磁盘托盘 螺丝 这里磁盘托盘 从盒子里拿出来就是
  • YARN异常YarnException:Failed while publishing entity的解决方案

    版本 HDP3 0 mapreduce提交任务计算时 job已经结束 但是容器仍不能关闭持续等待五分钟 INFO Thread 100 org apache hadoop yarn event AsyncDispatcher Waiting
  • 自定义类加载器

    package com bzu csh import java io ByteArrayOutputStream import java io File import java io FileInputStream import java