URLClassLoader可以让开发者定义classloader,从jar文件或目录加载类文件。当URLClassloader引用的是一个jar文件时,用户是不能自己关闭这个被打开的jar文件的,有时候这真是一个大问题。tomcat中可以动态的删除一个web应用,那他是怎么关闭打开的jar文件呢?这个web应用可以有自己的jar包,tomcat的也必须要打开这些jar包的。
tomcat的webClassLoader自己来管理这些被打开的jar文件,并在classloader中提供了closeJars方法,这样做真的是很明智的。jetty服务器中的WebAppClassLoader没有tomcat中的classLoader那么智能,他们真的需要改进一下。
下面的类也可以达到关闭jar文件的功能,他通过java中反射机制强行的关闭被打开的JarFile文件,但是这么做的话就依赖于jdk中的URLClassLoader的实现了,对于IBM或WEBLogic中的jdk可能不能运行。
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.JarFile;
public class TestClassLoader {
public static void main(String[] args) throws Exception {
File jar = new File("d:\\test\\commons-lang-2.2.jar");
URL[] urls = new URL[]{jar.toURI().toURL()};
URLClassLoader loader = new URLClassLoader(urls);
Class<?> cls = loader.loadClass("org.apache.commons.lang.StringUtils");
System.out.println(cls.getName());
// 查找URLClassLoader中的ucp
Object ucpObj = null;
Field ucpField = URLClassLoader.class.getDeclaredField("ucp");
ucpField.setAccessible(true);
ucpObj = ucpField.get(loader);
URL[] list = loader.getURLs();
for(int i=0;i<list.length;i++){
// 获得ucp内部的jarLoader
Method m = ucpObj.getClass().getDeclaredMethod("getLoader", int.class);
m.setAccessible(true);
Object jarLoader = m.invoke(ucpObj, i);
String clsName = jarLoader.getClass().getName();
if(clsName.indexOf("JarLoader")!=-1){
m = jarLoader.getClass().getDeclaredMethod("ensureOpen");
m.setAccessible(true);
m.invoke(jarLoader);
m = jarLoader.getClass().getDeclaredMethod("getJarFile");
m.setAccessible(true);
JarFile jf = (JarFile)m.invoke(jarLoader);
// 释放jarLoader中的jar文件
jf.close();
System.out.println("release jar: "+jf.getName());
}
}
}
}
分享到:
相关推荐
该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件pac
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
Springboot + Hutool-db 使用 URLClassLoader 动态加载外部数据库和数据池 jar包实例
在使用spring的aop功能时,这两个jar是必须的,否则会报错,如下: Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net....
使用URLClassLoader加载本地文件夹c盘下的test.jar文件
NULL 博文链接:https://yklovejava-163-com.iteye.com/blog/1736631
当然,dx 工具转了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件。第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用。要动态加载其它类,可以用的 Class Loader 有: ...
ECHO 处于关闭状态。 Exception in thread "main" java.lang.NoClassDefFoundError: pxb/android/dex2jar/v3/Main Caused by: java.lang.ClassNotFoundException: pxb.android.dex2jar.v3.Main at java.net....
执行链实际为:URLClassLoader.class.getConstructor(java.net.URL[].class).newInstance(new
1、用AXMLPrinter2.jar反编译xxx.xml文件 解压xxx.apk,选择main.xml(也可选择其它xml文件,不过xml文件都是乱码),复制到AXMLPrinter2.jar所在目录,通过cmd 进入到AXMLPrinter2.jar所在目录,使用如下命令,得到的...
加载jar这一部分很容易,可是卸载jar就没那么容易了。加载jar的时候需要用反射去调用URLClassLoader的addURL方法。}%>jars.jar内
at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.load...
NULL 博文链接:https://shihuan830619.iteye.com/blog/2160884
at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.load...
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(NativeMethod) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at sun.misc....
java发布wsdl部署到was 8.5报错的时候引入的jar包,比如如下情况: Caused by: java.lang.NoClassDefFoundError: com.sun.org.apache.xml.internal.resolver.CatalogManager at ...
ClassLoaderTest 测试自定义的URLClassLoader以加载类 测试如何正确关闭类加载器。 测试如何使用反射关闭JarFile来修复资源泄漏。
获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 * 4.创建DiagnosticCollector用来执行获取执行失败的错误结果 * 5.添加动态执行的编译环境 options ...
DexClassloader 这个一个demo,用来实现加载class文件,如果在实际项目中可以实现,动态修改代码的业务逻辑 首先在安卓中如果我们想实现的...3: URLClassloader: 可以加载java的jar包,但是Dalvik 虚拟机不支持这种加载方式