`

自定义classloader实现

    博客分类:
  • Java
 
阅读更多
package classloader;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 文件加载类 可根据MyFileClassLoader 从文件中动态生成类
 * 
 */
public class MyFileClassLoader extends ClassLoader {

	private String classPath;

	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException {
		MyFileClassLoader fileClsLoader = new MyFileClassLoader();
		fileClsLoader.setClassPath("c:\\003");
		Class cls = fileClsLoader
				.loadClass("classloader.TestCls");
		Object obj = cls.newInstance();
		Method[] mthds = cls.getMethods();
		for (int i = 0; i < mthds.length; i++) {
			Method mthd = mthds[i];
			String methodName = mthd.getName();
			System.out.println("mthd.name=" + methodName);
		}
		System.out.println("obj.class=" + obj.getClass().getName());
		System.out.println("obj.class=" + cls.getClassLoader().toString());
		System.out.println("obj.class="
				+ cls.getClassLoader().getParent().toString());
	}

	/**
	 * 根据类名字符串从指定的目录查找类,并返回类对象
	 */
	protected Class findClass(String name) throws ClassNotFoundException {
		byte[] classData = null;
		try {
			classData = loadClassData(name);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.defineClass(name, classData, 0, classData.length);
	}

	/**
	 * 根据类名字符串加载类 byte 数据流
	 * 
	 * @param name
	 *            类名字符串 例如: com.cmw.entity.SysEntity
	 * @return 返回类文件 byte 流数据
	 * @throws IOException
	 */
	private byte[] loadClassData(String name) throws IOException {
		File file = getFile(name);
		FileInputStream fis = new FileInputStream(file);
		byte[] arrData = new byte[(int) file.length()];
		fis.read(arrData);
		return arrData;
	}

	/**
	 * 根据类名字符串返回一个 File 对象
	 * 
	 * @param name
	 *            类名字符串
	 * @return File 对象
	 * @throws FileNotFoundException
	 */
	private File getFile(String name) throws FileNotFoundException {
		File dir = new File(classPath);
		if (!dir.exists())
			throw new FileNotFoundException(classPath + " 目录不存在!");
		String _classPath = classPath.replaceAll("[\\\\]", "/");
		int offset = _classPath.lastIndexOf("/");
		name = name.replaceAll("[.]", "/");
		if (offset != -1 && offset < _classPath.length() - 1) {
			_classPath += "/";
		}
		_classPath += name + ".class";
		dir = new File(_classPath);
		if (!dir.exists())
			throw new FileNotFoundException(dir + " 不存在!");
		return dir;
	}

	public String getClassPath() {
		return classPath;
	}

	public void setClassPath(String classPath) {
		this.classPath = classPath;
	}

}

 

 

 

分享到:
评论

相关推荐

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;

    ClassLoader运行机制 自己写的

    ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的

    Java类热替换(热部署)源码

    Java 自定义ClassLoader 实现类的热替换核心代码

    Java版水果管理系统源码-java-advanced:java-高级

    基于自定义Classloader实现类的动态加载和卸载:需要设计加载和卸载。 基于自定义Classloader实现模块化机制:需要设计模块化机制。 使用xar作为模块,实现xar动态加载和卸载:综合应用前面的内容。 NIO 常规 使用 ...

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    ClassLoader 案例

    自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术

    动态加载Apk、Jar

    通过自定义ClassLoader,实现动态加载apk,jar包功能。

    加密Java源代码

    加密Java源代码 ,使用自定义classloader加载器和加密解密技术实现

    Android中动态载入自定义类

    这种自定义类加载机制可以使用于一些场景: dex文件只能包含最多64K的函数引用,对于大型的程序如果超过了该数字,就可以通过把程序打包为多个dex文件来实现,在程序运行的时候在加载这些需要的类 一些开发框架可以通过...

    ClassLoaderDemo.7z

    以一个实际的小例子,演示关于使用ClassLoader实现自定义多组件的加载Demo,可以帮助理解类加载器的双亲委托及破坏。

    自定义类加载代码

    java,自定义加载类的实现。1.自定义加载类的实现。2双亲委派的验证。3如何制定父类加载器。

    service_classloader

    工程名为service_classloader,功能全部使用corejava实现,使用maven管理依赖,没有使用任何框架(junit除外)。 使用的技术主要包括:classlaoder,加密解密,线程,ThreadLocal使用,反射,IO操作,jdbc, 序列化,...

    Java虚拟机类装载:原理、实现与应用

    类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。

    Java发展史_&_Java9、10新特性

    主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class。 在引入了模块系统之后,JDK 被重新组织成 94 ...

    Android插件框架Android-Plugin-Framework.zip

    DexClassLoader的parent设置为宿主程序的classloader,即可将主程序和插件程序的class贯通 2、插件apk的资源 通过构造插件apk的AssetManager和Resouce类即可。 本项目最关键一点功能、也是和网上其他插件项目...

    springboot参考指南

    1. 介紹 2. I. Spring Boot文档 i. 1....ii. 2....iii....iv....v....vi....vii....3. II....i....ii....i....iii....i....i....ii....ii....i....ii....iii....iv....v.... 命令行实现 vi....iii....iv.... 自定义'白标'(whitelabel,可以了解下相关理念)错误页面 x. 71...

    DelegatingGroovyClassloader

    简单委托 Groovy 类加载器描述这是一个使用自定义类加载器的简单项目。 简单的想法是嵌入 GroovyClassLoader,并且所以,能够使用 Groovy 语言的所有能力,但是这还不够。 目标是能够暴露一个普通的 ClassLoader ...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下世界.mp4 │ 高并发编程第二阶段50讲、ClassLoader父委托机制详细介绍.mp4 │ 高并发编程第二阶段51讲、加密解密类加载实战演示.mp4 │ 高...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下世界.mp4 │ 高并发编程第二阶段50讲、ClassLoader父委托机制详细介绍.mp4 │ 高并发编程第二阶段51讲、加密解密类加载实战演示.mp4 │ 高...

Global site tag (gtag.js) - Google Analytics