`
tianlihu
  • 浏览: 311104 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Java 自定义 ClassLoader 加载jar

阅读更多
本文版权归作者所有,仅供用来网上学习来用,读者可以收藏,请不要下载到本机和重新发布到其它网站

有觉得可以改进的,请留言,也可加群讨论71326533

近日,用到自定义的class loader,加载Jar包中的。此类是最简单实现,由于考虑到所编的程序将用于手机上,可能URLClassLoader在J2ME或Android平台上没有,因此,做了一版本直接继承于java.lang.ClassLoader的。不再放入博客中了。

-----基于java.net.URLClassLoader的实现---------------------------
代码如下:
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;

public class EngineClassLoader extends URLClassLoader {

	public EngineClassLoader() {
		this(getSystemClassLoader());
	}

	public EngineClassLoader(ClassLoader parent) {
		super(new URL[] {}, parent);
	}

	public void addURL(URL... urls) {
		if (urls != null) {
			for (URL url : urls) {
				super.addURL(url);
			}
		}
	}

	public void addFile(File... files) throws IOException {
		if (files != null) {
			for (File file : files) {
				if (file != null) {
					super.addURL(file.toURI().toURL());
				}
			}
		}
	}
}


测试类代码
import java.io.File;

public class ClassLoaderTest {

	public static final String ZIP_PATH = "G:/Lib/Quaqua 3.9.4/lib/quaqua.jar";

	public static void main(String[] args) throws Throwable {
		EngineClassLoader loader1 = new EngineClassLoader();
		loader1.addURL(new File(ZIP_PATH).toURI().toURL());
		Class<?> clazz1 = loader1.loadClass("ch.randelshofer.quaqua.AnimatedBorder");

		EngineClassLoader loader2 = new EngineClassLoader();
		loader2.addURL(new File(ZIP_PATH).toURI().toURL());
		Class<?> clazz2 = loader2.loadClass("ch.randelshofer.quaqua.AnimatedBorder");

		System.out.println(clazz1 == clazz2);
	}
}


1
0
分享到:
评论

相关推荐

    CustomClassLoader:Java 自定义类加载器

    类加载器 以下代码是一个自定义类加载器,它从 jar 文件加载类。

    掌握Java类加载器

    类加载器是Java最强大的特征之一。但是开发者常常忘记类加载组件。类加载器是在运行时负责寻找和加载类...默认状态下,应用程序的每个类由java.lang.ClassLoader加载。因为它可以被继承,所以可以自由地加强其功能。

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

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

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

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

    Java虚拟机JVM类加载初始化

    3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再...

    ClassLoaderTest:测试如何正确关闭类加载器,以便可以关闭基础jar文件上的文件句柄

    ClassLoaderTest 测试自定义的URLClassLoader以加载类 测试如何正确关闭类加载器。 测试如何使用反射关闭JarFile来修复资源泄漏。

    JSP开发实用技术整理

    13. 自定义ClassLoader 13 14. double保留两位数的两个方案 18 16. 用户输入输出,文件输入输出范例(1) 19 17.以指定符号分割显示 22 17. 单例模式 22 18. 工厂模式 23 19. 读取配置文件(1) 25 20. 根据libName动态...

    indexed-classloader:一个自定义的 JVM 类加载器,它索引类路径元素以获得更快的类资源位置

    构建: ./make-jar.sh 要使用,将indexed-classpath.jar添加到类路径并设置-Djava.system.class.loader=org.pantsbuild.classloader.IndexedURLClassLoader 。 添加-verbose:class以查看来自类加载器的调试信息。

    java 面试题 总结

    栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。 堆是栈的一个组成元素 19、forward 和redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL...

    springboot参考指南

    加载YAML ii. 23.6.2. 在Spring环境中使用YAML暴露属性 iii. 23.6.3. Multi-profile YAML文档 iv. 23.6.4. YAML缺点 vii. 23.7. 类型安全的配置属性 i. 23.7.1. 第三方配置 ii. 23.7.2. 松散的绑定(Relaxed ...

    jmtrace

    jmtrace本项目实现了一个面向Java程序...在transformer中,首先排除由Boostrap Classloader的类, java包中的类和sun包中的类,然后使用适配器设计模式将其作为ClassReader的对象修改为自定义类ClassAdapter的实例。在

    超级有影响力霸气的Java面试题大全文档

     栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。 堆是栈的一个组成元素 22、forward 和redirect的区别  forward是服务器请求资源,服务器直接访问目标地址的URL,把...

Global site tag (gtag.js) - Google Analytics