今天被这个Classloader搞死了。起因是这样的:
public static void staticMethod(){
String resource = ClassLoader.getSystemResource("a.xml").toString();
}
然后a.xml已经加入了CLASSPATH。
整个代码是写在一个Ant的Task里,然后Ant里调用(事先<taskdef>)
这个时候在Eclipse调用build.xml,没有问题。
但是在命令行下调用ant,出错,找不到,返回null。
于是到Task里的execute里测试一下
public void execute(){
String resource = getClass().getClassLoader().getResource("a.xml").toString();
}
两个环境都找到了。
看来是static的函数里ClassLoader比较不一样,是systemClassLoader估计。
然后这么写:
public static void staticMethod(){
String resource = new Object().getClass().getClassLoader().getResource("a.xml").toString();
}
居然报出一个NullPointerException,原来是返回的ClassLoader为空。马上查了一下ClassLoader的源码(IBM JDK),发现如果某个instance的classloader=systemClassLoader就返回空。什么道理啊。。。
这么写,也不行
public static void staticMethod(){
String resource = ClassLoader.getSystemClassLoader().getResource("a.xml").toString();
}
这么写,还是不行
public static void staticMethod(){
String resource = ClassLoader.getSystemClassLoader().getParent().getResource("a.xml").toString();
}
嗯,把那个类换成Singleton,发现居然可以了。
后来发现要这么写:
public class Test{
public static void staticMethod(){
String resource = new Test().getClass().getClassLoader().getResource("a.xml").toString();
}
}
才OK。。。
Eclipse自已有ClassLoader,Ant自己又有ClassLoader。才有这么多问题。
接下来我想搞的OSGi,每个Bundle都有自己的classloader实例。。。。晕死了。。。
分享到:
相关推荐
org.apache.tools.ant.AntClassLoader org.apache.tools.ant.BuildException org.apache.tools.ant.DynamicElement org.apache.tools.ant.NoBannerLogger org.apache.tools.ant.PropertyHelper org.apache....
Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
自定义classloader的使用
ClassLoader原理,ClassLoader原理 ClassLoader原理
NULL 博文链接:https://frankfan915.iteye.com/blog/1169243
Java ClassLoader定制实例
破解java加密的ClassLoader.java,在classloader植入破解代码
java classloader classpath 张孝祥
Classloader
理解Java ClassLoader机制
用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。
ClassLoader类加载机制和原理详解
classloader 源码,自定义classloader
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...
JVM ClassLoader简析.压缩包中文档和示例代码
classloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloader