如题。
解决方案 »
- 内网部署了一webservice服务,无法访问,但外网可以
- struts2想页面输出回车的问题
- SOAP 的HEADER元素的ACTOR到底是什么意思呀?有什么用?
- 请教个小问题
- 有个初级问题,望前辈们指教,谢谢!
- 关于Struts中连接SQLServer的问题,大家看一下我的配置,现在Tomcat启动报错,大概就是数据库连接的问题,请问怎么回事?
- j2ee的3个理论性问题,每题10分,有实质性回答的有分!
- 关于系统学习JAVA--老鸟,小鸟们进来说说看
- 请问哪位有在orion里成功布署过ejb的?俺刚接触这个东西,一时不知如何下手
- 请问:谁有《J2EE应用与BEA Weblogic Server》的配套光盘,能否把盘上的例子发给我。
- 各位前辈,第一次找工作,项目描述这样做可以吗?欢迎大家批评。。。
- sql语句中有int类型时,该怎么表示
以上是个人为了毕业要发表的一篇论文,没有什么深度,下面再继续讨论一点关于ClassLoader的一定东东:public class ClassLoaderTest1{
private ClassLoaderTest2 test = null;
public ClassLoaderTest1(){
test = new ClassLoaderTest2();
}
public void method(){
System.out.println("Loading ClassA");
}
}
class ClassLoaderTest2{
public ClassLoaderTest2(){
}
public void method(){
System.out.println("Loading ClassA");
}
}测试程序:
URL url = null;
try {
url = new URL("file:/E:/JAVA/MyProject/string/");
} catch (MalformedURLException e) {
e.printStackTrace();
}
URLClassLoader cl = new URLClassLoader(new URL[]{url});
URLClassLoader cl1 = new URLClassLoader(new URL[]{url});
try {
Class tempClass = cl.loadClass("ClassLoaderTest1");
Class tempClass2 = cl.loadClass("ClassLoaderTest2");
Object test = tempClass.newInstance();
System.out.println(tempClass.getClassLoader());
System.out.println(tempClass2.getClassLoader());
} catch (Exception e) {
e.printStackTrace();
}当ClassLoaderTest1,ClassLoaderTest2在当前目录和E:/JAVA/MyProject/string/都存在的时候输出为sun.misc.Launcher$AppClassLoader@1050169
sun.misc.Launcher$AppClassLoader@1050169
即都是被AppClassLoader加载的, 即使在E:/JAVA/MyProject/string/下面也存在.当ClassLoaderTest1,ClassLoaderTest2只在E:/JAVA/MyProject/string/下存在的时候输出为
java.net.URLClassLoader@480457
java.net.URLClassLoader@1a7bf11
即都是被自定义的加载器加载的,并且也可以Object test = tempClass.newInstance();下面一的是最关键的,因为ClassLoaderTest1需要用到ClassLoaderTest2,如果ClassLoaderTest2被AppClassLoader加载,而ClassLoaderTest1是被自定义的类加载器加载,就会出现如下错误:java.lang.IllegalAccessError: tried to access class ClassLoaderTest2 from class ClassLoaderTest1
at ClassLoaderTest1.<init>(ClassLoaderTest1.java:6)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
at java.lang.Class.newInstance0(Class.java:308)
at java.lang.Class.newInstance(Class.java:261)
at ClassLoaderTest.main(ClassLoaderTest.java:43)
所以JVM在寻找类的时候,不仅仅是根据类的名称,而是根据类明和类的加载器一起来决定的!
建议楼主看下dynamaic proxy 模式,或者aop源码,
Class clazz=Thread.currentThread().getContextClassLoader().loadClass(className);
你这个问题浩大,建议你去看看java虚拟机的原理得啦
推荐一本书
http://book.csdn.net/hi/BookClub_BookDetails.aspx?id=12609
下面这个地址是技术分析Java类加载内幕详细讲解http://www.99inf.net/SoftwareDev/Java/45133.htm