代码来源
http://www.oschina.net/code/snippet_54100_3353
加载原理
http://vivisidea.iteye.com/blog/662620
package libra.law.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class DynamicClassLoader extends ClassLoader {
public DynamicClassLoader(ClassLoader parent) {
super(parent);
}
@SuppressWarnings("unchecked")
public Class loadClass(String classPath, String className)
throws ClassNotFoundException {
try {
String url = classPathParser(classPath)
+ classNameParser(className);
System.out.println(url);
URL myUrl = new URL(url);
URLConnection connection = myUrl.openConnection();
InputStream input = connection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int data = input.read();
while (data != -1) {
buffer.write(data);
data = input.read();
}
input.close();
byte[] classData = buffer.toByteArray();
return defineClass(noSuffix(className), classData, 0,
classData.length);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private String pathParser(String path) {
return path.replaceAll("\\\\", "/");
}
private String classPathParser(String path) {
String classPath = pathParser(path);
if (!classPath.startsWith("file:")) {
classPath = "file:" + classPath;
}
if (!classPath.endsWith("/")) {
classPath = classPath + "/";
}
return classPath;
}
private String classNameParser(String className) {
return className.substring(0, className.lastIndexOf(".")).replaceAll(
"\\.", "/")
+ className.substring(className.lastIndexOf("."));
}
private String noSuffix(String className) {
return className.substring(0, className.lastIndexOf("."));
}
public static void main(String[] arguments) throws Exception {
String classPath = "C:\\Documents and Settings\\Administrator\\Workspaces\\MyEclipse7.5\\lhsp\\web\\WEB-INF\\classes";
String className = "libra.law.util.Test.class";
new DynamicClassLoader(DynamicClassLoader.class.getClassLoader())
.loadClass(classPath, className).newInstance();
}
}
分享到:
相关推荐
1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态加载类的需求。自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`find...
自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨自定义Classloader的使用。 一、Classloader的工作原理 Java的类加载机制遵循双亲...
ClassLoader就是执行这个动态加载任务的机制。 Java ClassLoader的工作流程大致如下: 1. 当程序需要加载一个类时,它会请求ClassLoader。 2. ClassLoader接收到请求后,首先检查该类是否已经加载过,如果已加载则...
ClassLoader的基本职责是根据类名动态加载对应的类文件。在Java中,类加载过程遵循双亲委派模型(Parent Delegation Model)。这意味着当一个ClassLoader尝试加载某个类时,它首先会将任务委托给其父ClassLoader。...
在某些特定场景下,比如动态加载代码、插件系统或者安全隔离等,我们需要自定义ClassLoader来实现特定的加载逻辑。例如,我们可能希望加载网络上的类,或者从数据库中读取类的字节码。 以...
当我们谈论"ClassLoader动态加载dex"时,实际上是指在Android应用程序运行时,通过自定义的ClassLoader来动态加载`.dex`(Dalvik Executable)文件,这是Android程序的字节码格式。这种技术在进行热修复、插件化或者...
了解和掌握ClassLoader的概念及其应用,对于理解和调试复杂的Java应用程序,尤其是涉及到动态加载和插件化开发的场景,是非常有帮助的。通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为...
当程序运行时,ClassLoader根据需要动态加载这些类。Java提供了三种内置的ClassLoader: 1. BootstrapClassLoader(启动类加载器):它是JVM的基础,由C++实现,不继承自`java.lang.ClassLoader`。...
这些细节展示了ClassLoader工作中的灵活性和复杂性,也是Java动态性的重要体现。 了解ClassLoader的工作机制对于优化程序性能、处理类冲突以及实现安全的插件系统至关重要。开发者可以根据需求定制ClassLoader,以...
总的来说,理解和掌握JVM ClassLoader对于优化Java应用性能、实现动态加载和插件系统至关重要。深入学习ClassLoader不仅有助于提升编程技巧,也有助于解决实际开发中遇到的类加载问题。阅读"ClassLoader简析.pdf...
自定义ClassLoader允许开发者根据特定需求加载类,比如动态加载或更新类文件,这在某些高级应用场景中非常有用,如插件系统、热部署等。本案例将深入探讨如何创建一个自定义的ClassLoader,利用Java反射和注解技术...
总的来说,Java ClassLoader机制是Java平台的核心特性之一,它使得程序具有动态性和可扩展性。深入理解ClassLoader的工作原理,不仅有助于提升编程能力,还能帮助开发者在面对复杂系统设计时做出更明智的决策。
### ClassLoader概述 ...这种方法在某些特定场景下非常有用,比如在需要动态加载类的系统中或者在安全模型需要更细粒度控制的情况下。理解类加载器的工作原理对于深入学习Java虚拟机和其底层机制非常重要。
Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...
通过自定义ClassLoader,开发者可以实现许多高级功能,如动态加载、插件机制等,从而增强软件的灵活性和可维护性。同时,掌握双亲委派模型可以帮助解决类加载过程中的问题,避免出现类加载混乱的情况。
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中执行。这篇测试主要探讨了ClassLoader的工作原理及其在实际应用中的使用。通过阅读给出的博文链接,我们可以深入理解...
上述代码展示了如何创建一个动态ClassLoader来实现热部署的基本思想。ManageClassLoader会检查类文件的修改时间,如果发现变化,就使用DynamicClassLoader加载新的字节码。 尽管Java标准版(J2SE)没有内置的热部署...
对于工具的使用,可能是指开发者如何利用ClassLoader进行一些自定义操作,比如动态加载类、热部署等。例如,在开发插件化系统时,可能会创建自定义的ClassLoader,隔离不同插件的类加载,避免类冲突。 ClassLoader...
当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了如何创建一个自定义的ClassLoader,以便能够灵活地加载不在应用主类路径(ClassPath)中的jar...