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提供...
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;
当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了如何创建一个自定义的ClassLoader,以便能够灵活地加载不在应用主类路径(ClassPath)中的jar...
4. 类隔离:通过自定义ClassLoader实现不同模块之间的类隔离,避免类冲突。 总的来说,深入理解ClassLoader的工作原理对于优化程序性能、构建灵活的插件系统和解决类冲突问题具有重要意义。通过测试和实践,我们...
这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在Java中,类加载过程遵循双亲委派模型(Parent Delegation Model)。这...
自定义`ClassLoader`的设计和实现是一个高级话题,需要深入理解Java的类加载机制。通过这种方式,可以有效地解决在反序列化过程中因`serialVersionUID`不一致导致的问题,同时减少潜在的副作用,提升程序的稳定性和...
对于标题“Java SE: ...- 模块化/插件化:对于需要模块化或插件化的应用程序,可以通过自定义ClassLoader实现模块的热加载或动态卸载。 深入理解ClassLoader机制对于开发大型、复杂或动态可扩展的Java应用非常重要。
本文将深入探讨如何通过自定义ClassLoader实现动态加载Apk和Jar包的功能。 首先,我们要理解ClassLoader的基本概念。在Java中,ClassLoader是负责加载类到JVM(Java虚拟机)的核心组件。它按照类名查找并加载相应的...
在Android中,我们可以利用自定义类加载器实现动态加载其他工程类的需求。这通常涉及到以下场景: - 插件化开发:通过自定义类加载器,可以实现主程序在运行时加载插件工程的类,使得更新或扩展功能时无需重新发布...
在Android开发中,自定义ClassLoader是一项关键技能,尤其在实现热修复和插件化技术时。本文主要探讨了Android中自定义ClassLoader导致的性能问题,特别是冷启动速度的影响。问题的核心在于,通过插入自定义的...
在压缩包中的`MyClassLoader`文件,可能是实现自定义ClassLoader的源代码。这个类可能会包含以下部分: 1. 类加载器的实例化和配置,包括指定加载类的目录。 2. 对`loadClass()` 和 `findClass()` 的覆写,实现...
上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...
- 在某些特殊情况下,我们可能需要自定义ClassLoader来实现特定的加载逻辑,例如从网络、数据库或加密文件中加载类。 - 自定义ClassLoader通常需要重写`loadClass()`方法,该方法在找不到类时调用`findClass()`...
在某些特定场景下,比如动态加载代码、插件系统或者安全隔离等,我们需要自定义ClassLoader来实现特定的加载逻辑。例如,我们可能希望加载网络上的类,或者从数据库中读取类的字节码。 以...
基于自定义Classloader实现类的动态加载和卸载:需要设计加载和卸载。 基于自定义Classloader实现模块化机制:需要设计模块化机制。 使用xar作为模块,实现xar动态加载和卸载:综合应用前面的内容。 NIO 常规 使用 ...
原 ClassLoader 不会重新加载类,因此自定义 ClassLoader 是实现动态加载的关键。这个思路常用于容器或框架中,例如在 Web 应用服务器中,允许热部署应用的更新。 2. "书写一次,到处运行":Java 的跨平台特性源于...
为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...
了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对ClassLoader API的使用和自定义的详细说明。 首先,我们来看ClassLoader的基本概念。在Java中,...
但有时我们可能需要打破这种模型,比如实现类的版本控制或插件系统,这时可以通过自定义ClassLoader来实现。 5. 类加载器的关系图 Java中的ClassLoader形成了一个树状结构,Bootstrap ClassLoader位于顶端,其他类...