- 浏览: 242100 次
文章分类
最新评论
引自http://wenku.baidu.com/view/7d6e427002768e9951e73863.html
我们知道,Java利用ClassLoader将类载入内存,并且在同一应用中,可以有很多个ClassLoader,通过委派机制,把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。当父类为null时,JVM内置的类(称为:bootstrap class loader)就会充当父类。想想眼下的越来越多用XML文件做配置文件或者是描述符、部署符。其实这些通过XML文档描述的配置信息最终都要变成 Java类,基实都是通过ClassLoader来完成的。URLClassLoader是ClassLoader的子类,它用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。
下面来看一个例子,在该例子中,我们要完成的工作是利用URLClassLoader加载jar并运行其中的类的某个方法。
首先我们定义一个接口,使所有继承它的类都必须实现action方法,如下:
public interface ActionInterface {
public String action();
}
完成后将其打包为testInterface.jar文件。
接下来新建一工程,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现 ActionInterface接口。如下:
public class TestAction implements ActionInterface {
public String action() {
return " com.mxjava.TestAction.action " ;
}
}
完成后将其打包为test.jar,放在c盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
新建一工程,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:
URL url = new URL(“file:C: / test.jar”);
URLClassLoader myClassLoader = new URLClassLoader( new URL[] { url } );
Class myClass = myClassLoader.loadClass(“com.mxjava.TestAction”);
ActionInterface action = (ActionInterface)myClass.newInstance();
System.out.println(action.action());
在上面的例子中,首先利用URLClassLoader加载了C:/test.jar包,将其中的com.mxjava.TestAction类载入内存,将其强制转型为testInterface包中的ActionInterface类型,最后调用其action方法,并打印到控制台中。
执行程序后,在控制台上如期打印出我们想要的内容。但是,事情并没有那么简单,当我们将该代码移动web应用中时,就会抛出异常。原来,Java为我们提供了三种可选择的ClassLoader:
1. 系统类加载器或叫作应用类加载器 (system classloader or application classloader)
2. 当前类加载器
3. 当前线程类加载器
在上例中我们使用javac命令来运行该程序,这时候使用的是系统类加载器 (system classloader)。这个类加载器处理 -classpath下的类加载工作,可以通过ClassLoader.getSystemClassLoader()方法调用。 ClassLoader 下所有的 getSystemXXX()的静态方法都是通过这个方法定义的。在代码中,应该尽量少地调用这个方法,以其它的类加载器作为代理。否则代码将只能工作在简单的命令行应用中。当在web应用中时,服务器也是利用ClassLoader来加载class的,由于ClassLoader的不同,所以在强制转型时JVM认定不是同一类型。(在JAVA中,一个类用其完全匹配类名(fully qualified class name)作为标识,这里指的完全匹配类名包括包名和类名。但在JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识。因此,如果一个名为Pg的包中,有一个名为Cl的类,被类加载器KlassLoader的一个实例kl1加载,Cl的实例,即C1.class在JVM中表示为 (Cl, Pg, kl1)。这意味着两个类加载器的实例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的,被它们所加载的类也因此完全不同,互不兼容的。)为了能够使程序正确运行,我们首要解决的问题就是,如何将 URLClassLoader加载的类,同当前ClassLoader保持在同一类加载器中。解决方法很简单,利用java提供的第三种 ClassLoader—当前线程类加载器即可。jdk api文档就会发现,URLClassLoader提供了三种构造方式:
// 使用默认的委托父 ClassLoader 为指定的 URL 构造一个新 URLClassLoader。
URLClassLoader(URL[] urls)
// 为给定的 URL 构造新 URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent)
// 为指定的 URL、父类加载器和 URLStreamHandlerFactory 创建新 URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
接下来要做的就是,在构造URLClassLoader时,将当前线程类加载器置入即可。如下:
URLClassLoader myClassLoader = new URLClassLoader( new URL[] { url } , Thread.currentThread().getContextClassLoader());
总结:
Java是利用ClassLoader来加载类到内存的,ClassLoader本身是用java语言写的,所以我们可以扩展自己的 ClassLoader。利用URLClassLoader可以加载指定jar包中的类到内存。在命行上利用URLClassLoader加载jar时,是使用系统类加载器来加载class的,所以在web环境下,就会出错。这是因为JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识的。我们只要利用URLClassLoader的第二种构造方法并传入当前线程类加载器即可解决。
发表评论
-
mac svn版本
2014-11-14 15:21 842http://xiayong.blog.51cto.com ... -
lucene索引结构比较好得博客
2014-11-03 21:16 626http://www.cnblogs.com/forfutur ... -
lucene再64位系统上使用MMapDirectory
2014-11-03 20:18 2070引子http://www.cnblogs.com/huang ... -
mvn发布单个文件
2014-10-31 15:38 628由于平时我们开发都是一个大项目中包含几个子项目,需要depl ... -
使用 ObjectOutputStream 可能引起的内存泄漏
2014-10-30 17:14 1427场景,线上堆栈10G,平时内存使用达到8个G而 ... -
CMS GC时出现promotion failed和concurrent mode failure
2014-10-29 23:44 819对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中 ... -
jboss发布war
2014-10-23 13:09 714http://www.blogjava.net/hello-y ... -
netty学习blog
2014-10-09 16:04 606http://www.infoq.com/cn/article ... -
java多线程
2014-10-08 13:37 597http://www.cnblogs.com/skywang1 ... -
volatile和重排序得一些小疑问
2014-09-24 15:38 1603http://yeziwang.iteye.com/blog ... -
内存映射文件
2014-09-19 11:09 712简介: 内存映射文件与虚拟内存有些类 ... -
心跳机制 heartbeat
2014-08-05 23:13 1771心跳机制可以分为集中式和分散式,简单说集中式 ... -
一个性能瓶颈分析的过程
2014-07-29 16:19 530引自http://blog.csdn.net/axm ... -
zip gzip
2014-07-29 15:09 573http://www.differencebetween. ... -
mvn expected: CRLF
2014-07-03 14:36 754Checkstyle error is not severe ... -
git远程分支更新
2013-10-09 16:44 868git remote prune origin清理掉远程不存 ... -
关于synchronized一个字符串的问题
2013-07-25 11:12 6266在memcached中我们公司首先根据查询条件获得key,然 ... -
php树型无限级分类结构[预排序遍历树算法]
2013-07-22 18:22 866预排序遍历树算法 modi ... -
linux下打开class文件
2013-03-04 20:22 2426linux下打开class文件 hexdump -C *.cl ... -
对象分配规则
2013-02-27 14:03 845对象分配规则 1.对象优先分配在Eden区,如果Eden区 ...
相关推荐
创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 * 4.创建DiagnosticCollector用来执行获取执行失败的错误结果 *...
学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...
该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件pac
使用URLClassLoader加载本地文件夹c盘下的test.jar文件
2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 当一个类被加载、连接、...
3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的.class文件则重新加载该实现类的class。 4. 调用方法前,先获取最新的代理类,然后调用代理类的方法。 这样,每次调用代理类中的方法,都会...
类加载器分为根加载器(bootstrap classloader)、扩展类加载器(ext classloader)、系统类加载器(system classloader)、自定义类加载器(通常继承java.net.URLClassLoader,重写findClass()),它们的关系通常...
at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang....
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
ClassLoaderTest 测试自定义的URLClassLoader以加载类 测试如何正确关闭类加载器。 测试如何使用反射关闭JarFile来修复资源泄漏。
2、ClassLoader的实现类URLClassLoader完成工作的方法是根据传入的class目录或jar文件的URL读取二进制文件,并转化为Class; 3、ClassLoader有个成员变量parent,使用ClassLoader获取Class时,默认会先用它的...
造成的后果使用者负责 JSP-Webshells集合BCEL字节码的JSP Webshell自定义类加载器的JSP Webshell ScriptEngine.eval的JSP Webshell URLClassLoader加载远程jar的JSP Webshell javac动态编译类的...
什么是类的加载 我们平时所编写的“xx.java”文件需要经过我们所知的java编译器(javac)编译成“xx.class”文件,这个文件存放着编译后jvm指令的的二进制信息。而**当我们需要用到某个类时,jvm将会加载它,并在...
3.9.4 java.net.URLClassLoader 49 3.9.5 类的路径 50 3.10 java.lang.SecurityManager 51 3.10.1 使用安全管理器的实例 51 3.10.2 JDK1.2中没有改变的API 52 3.10.3 JDK1.2中禁用的方法 53 3.11 java.security....
目录 第1章 lambda表达式 0 1.1 为什么要使用lambda表达式 2 1.2 lambda表达式的语法 4 1.3 函数式接口 6 1.4 方法引用 8 1.5 构造器引用 10 ...9.5.5 URLClassLoader 206 9.5.6 BitSet 206 练习 207 索引 209
3.9.4 java.net.URLClassLoader 49 3.9.5 类的路径 50 3.10 java.lang.SecurityManager 51 3.10.1 使用安全管理器的实例 51 3.10.2 JDK1.2中没有改变的API 52 3.10.3 JDK1.2中禁用的方法 53 3.11 java.security....
关于动态加载apk,理论上可以用到的有DexClassLoader,PathClassLoader和URLClassLoader; plugin 原理是通过 Android API 中的 pm 包下 和 res 包下 类 import android.content.pm.PackageInfo; import android....
Android中类加载器有BootClassLoader,URLClassLoader, PathClassLoader,DexClassLoader,BaseDexClassLoader,等都最终继承自java.lang.ClassLoader 最近在优化西瓜视频客户端冷启动速度时,发现在关闭插件 ...
首先第一个是 jar 文件的制作,Java 里面直接把 .class ...第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用。要动态加载其它类,可以用的 Class Loader 有: DexClassLoader,PathClassLoader
规则 5.6 避免完全依赖URLClassLoader和java.util.jar提供的默认自动签名认证机制 规则 6.1 禁止给仅执行非特权操作的代码签名 规范 6.2 不要使用危险的许可与目标组合 规则 6.3 不要禁用字节码验证 规则 6.4 ...