`

基于Java 类加载原理实验类动态替换

 
阅读更多
   一个小实验,基于对Java类加载模型的理解,实现一个Java类动态替换的效果,仅供学习理解Java类加载机制。
关键:
(1)JVM通过类的加载器和类全名组合识别一个类。
(2)类加载器层次结构及委托加载模型
(3)自定义类加载器

示例:
(1)定义一个服务接口及其实现类:AService 和 SimpleA,提供简单的add服务。
AService
package org.demo;

public interface AService {

	public int add(int a, int b);
}


SimpleA
package org.demo;

public class SimpleA implements AService {

	@Override
	public int add(int a, int b) {
		int result = 0;
		result = a + b;
		return result;
	}

}


(2)自定义类加载器HotreplaceLoader,加载示例中需要动态替换的类
package org.demo;

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

public class HotreplaceLoader extends ClassLoader {

	public HotreplaceLoader(){
		super(null);
	}
	
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] data = loadClassData(name);
		return this.defineClass(name, data, 0, data.length);
	}
	
	public byte[] loadClassData(String name) {
		try {
			name = name.replace(".", "//");
			FileInputStream is = new FileInputStream(new File(
					"E:\\loadclass\\src\\" + name + ".class"));
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int b = 0;
			while ((b = is.read()) != -1) {
				baos.write(b);
			}
			return baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
		Class cls = null;
		cls = findLoadedClass(name);
		if(!name.equals("org.demo.SimpleA") && cls == null){
			cls = getSystemClassLoader().loadClass(name);
		}else{
			try{
				cls = findClass("org.demo.SimpleA");
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		if (cls == null)
			throw new ClassNotFoundException(name);
		if (resolve)
			resolveClass(cls);
		return cls;
	}
	
}


(3)主进程Worker,无限循环加载目标类,并调用其服务,每次调用后休息
package org.demo;

import java.lang.reflect.Method;

public class Worker {

	public static void main(String[] args) throws Exception{
		for(;;){
			HotreplaceLoader loader = new HotreplaceLoader();
			Class cls = loader.loadClass("org.demo.SimpleA");
			//Object aService = cls.newInstance();
			//Method m = aService.getClass().getMethod("add", new Class[]{int.class, int.class});
			//Object count = m.invoke(aService, new Object[]{1, 1});
			AService as = (AService)cls.newInstance();
			int count = as.add(1, 1);
			System.out.println(String.valueOf(count));
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}

}


(4)验证
执行主进程,控制台不断打出“2”。
修改SimpleA 源码为:
public class SimpleA implements AService {

	@Override
	public int add(int a, int b) {
		int result = 0;
		result = (a + b)*2;
		return result;
	}

}

然后将编译好的字节码SimleA.class,拷贝到设定的加载目录E:\loadclass\src\替换原来的字节码文件。
控制台变化,不断打出“4”。


参考:
Java 类的热替换 —— 概念、设计与实现
http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/
分享到:
评论

相关推荐

    java程序编译原理实验

    java程序编译原理实验

    基于java-GUI的实验室设备管理系统源码.zip

    基于java-GUI的实验室设备管理系统源码.zip基于java-GUI的实验室设备管理系统源码.zip基于java-GUI的实验室设备管理系统源码.zip基于java-GUI的实验室设备管理系统源码.zip基于java-GUI的实验室设备管理系统源码.zip...

    Java动态加载类小实验.pdf

    Java动态加载类小实验.pdf

    java类的封装实验报告.pdf

    java类的封装实验报告.pdf

    基于Java web实验室器材管理系统的设计与实现.docx

    基于Java web实验室器材管理系统的设计与实现.docx基于Java web实验室器材管理系统的设计与实现.docx基于Java web实验室器材管理系统的设计与实现.docx基于Java web实验室器材管理系统的设计与实现.docx基于Java web...

    java 类加载调试

    JVM 如何帮助找出类装入问题 Lakshmi Shankar, Java 技术中心开収团队, IBM Hursley 实验室 Simon Burns (simon_burns@uk.ibm.com), Java 技术中心开収团队, IBM Hursley 实验室 简介: 类装入组件是 Java™ 虚拟机...

    基于SYSTEMVIEW通信原理实验报告北邮通信原理实验

    基于SYSTEMVIEW通信原理实验报告北邮通信原理实验

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    基于Java进行区块链原理实验【100013103】

    功能一:实现采购商品—签发应收账款易上链。例如车企从轮胎公司购买一批轮胎并签订应收账款单据。 功能二:实现应收账款的转让上链,轮胎公司从轮毂公司购买一笔轮毂,便将于车企的应收账款单据部分转让给轮毂公司...

    java常用系统类库实验

    java 常用系统类库 实验 java实验报告

    编译原理实验java

    编译原理实验,包括词法分析,语法分析,中间代码生成等。java实现,采用递归下降的方法。

    基于JAVA Web的实验室管理系统的设计与实现.docx

    基于JAVA Web的实验室管理系统的设计与实现.docx基于JAVA Web的实验室管理系统的设计与实现.docx基于JAVA Web的实验室管理系统的设计与实现.docx基于JAVA Web的实验室管理系统的设计与实现.docx基于JAVA Web的实验室...

    基于Java抽象类和接口实现疯狂动物城

    学生通过对该项目整体框架的搭建和对动物城信息管理等模块的设计与功能实现,训练了学生对项目框架的搭建、类的封装、抽象类定义与继承、接口的定义与接口的实现等Java OOP面向对象知识点的掌握。 本项目主要包括...

    基于Java web实验室器材管理系统的设计与实现.pdf

    基于Java web实验室器材管理系统的设计与实现.pdf基于Java web实验室器材管理系统的设计与实现.pdf基于Java web实验室器材管理系统的设计与实现.pdf基于Java web实验室器材管理系统的设计与实现.pdf基于Java web实验...

    类与对象-java实验报告

    1) 熟悉Java中类的设计; 2) 设计类的数据域与方法; 3) 设计类与类之间的关系 4)使用设计的类 实验内容 对平面几何中的各种基本图形使用面向对象的设计方法建模,需要设计的类包括:点、直线、三角形、矩形、...

    课程作业-基于Java实现web实验登录界面源码+项目说明.zip

    课程作业-基于Java实现web实验登录界面源码+项目说明.zip课程作业-基于Java实现web实验登录界面源码+项目说明.zip课程作业-基于Java实现web实验登录界面源码+项目说明.zip课程作业-基于Java实现web实验登录界面源码+...

    开题报告-基于Java的酒店客房管理系统的设计与实现.docx

    开题报告-基于Java的酒店客房管理系统的设计与实现.docx开题报告-基于Java的酒店客房管理系统的设计与实现.docx开题报告-基于Java的酒店客房管理系统的设计与实现.docx开题报告-基于Java的酒店客房管理系统的设计与...

    基于Java的GUI网络通信实验

    基于Java的GUI网络通信实验,基于Java socket编写。有需要的同学可以下载哦

Global site tag (gtag.js) - Google Analytics