`

自定义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;
	}

}

 

 

 

分享到:
评论

相关推荐

    自定义classloader的使用

    自定义Classloader还可以实现动态加载和卸载类的功能。在某些场景下,比如插件系统,我们需要在运行时加载或卸载特定的类,这时自定义Classloader的灵活性就体现出来了。 七、安全考虑 尽管自定义Classloader提供...

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

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

    定义ClassLoader调用外部jar包

    当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了如何创建一个自定义的ClassLoader,以便能够灵活地加载不在应用主类路径(ClassPath)中的jar...

    ClassLoader的 一些测试

    4. 类隔离:通过自定义ClassLoader实现不同模块之间的类隔离,避免类冲突。 总的来说,深入理解ClassLoader的工作原理对于优化程序性能、构建灵活的插件系统和解决类冲突问题具有重要意义。通过测试和实践,我们...

    ClassLoader运行机制 自己写的

    这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在Java中,类加载过程遵循双亲委派模型(Parent Delegation Model)。这...

    使用自定义ClassLoader解决反序列化serialVesionUID不一致问题 _ 回忆飘如雪1

    自定义`ClassLoader`的设计和实现是一个高级话题,需要深入理解Java的类加载机制。通过这种方式,可以有效地解决在反序列化过程中因`serialVersionUID`不一致导致的问题,同时减少潜在的副作用,提升程序的稳定性和...

    Java SE: ClassLoader in depth

    对于标题“Java SE: ...- 模块化/插件化:对于需要模块化或插件化的应用程序,可以通过自定义ClassLoader实现模块的热加载或动态卸载。 深入理解ClassLoader机制对于开发大型、复杂或动态可扩展的Java应用非常重要。

    动态加载Apk、Jar

    本文将深入探讨如何通过自定义ClassLoader实现动态加载Apk和Jar包的功能。 首先,我们要理解ClassLoader的基本概念。在Java中,ClassLoader是负责加载类到JVM(Java虚拟机)的核心组件。它按照类名查找并加载相应的...

    classloader

    在Android中,我们可以利用自定义类加载器实现动态加载其他工程类的需求。这通常涉及到以下场景: - 插件化开发:通过自定义类加载器,可以实现主程序在运行时加载插件工程的类,使得更新或扩展功能时无需重新发布...

    关于Android中自定义ClassLoader耗时问题的追查

    在Android开发中,自定义ClassLoader是一项关键技能,尤其在实现热修复和插件化技术时。本文主要探讨了Android中自定义ClassLoader导致的性能问题,特别是冷启动速度的影响。问题的核心在于,通过插入自定义的...

    ClassLoader 案例

    在压缩包中的`MyClassLoader`文件,可能是实现自定义ClassLoader的源代码。这个类可能会包含以下部分: 1. 类加载器的实例化和配置,包括指定加载类的目录。 2. 对`loadClass()` 和 `findClass()` 的覆写,实现...

    java自定义类加载classloader文档,包括代码

    上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...

    ClassLoader小例子

    - 在某些特殊情况下,我们可能需要自定义ClassLoader来实现特定的加载逻辑,例如从网络、数据库或加密文件中加载类。 - 自定义ClassLoader通常需要重写`loadClass()`方法,该方法在找不到类时调用`findClass()`...

    Java ClassLoader定制实例

    在某些特定场景下,比如动态加载代码、插件系统或者安全隔离等,我们需要自定义ClassLoader来实现特定的加载逻辑。例如,我们可能希望加载网络上的类,或者从数据库中读取类的字节码。 以...

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

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

    Java常用基础知识-kaic.docx

    原 ClassLoader 不会重新加载类,因此自定义 ClassLoader 是实现动态加载的关键。这个思路常用于容器或框架中,例如在 Web 应用服务器中,允许热部署应用的更新。 2. "书写一次,到处运行":Java 的跨平台特性源于...

    Understanding the Java ClassLoader

    为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...

    ClassLoader类加载器

    了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对ClassLoader API的使用和自定义的详细说明。 首先,我们来看ClassLoader的基本概念。在Java中,...

    ClassLoader类加载机制和原理详解

    但有时我们可能需要打破这种模型,比如实现类的版本控制或插件系统,这时可以通过自定义ClassLoader来实现。 5. 类加载器的关系图 Java中的ClassLoader形成了一个树状结构,Bootstrap ClassLoader位于顶端,其他类...

Global site tag (gtag.js) - Google Analytics