关于classloader的一个问题 Javaclassloaderjvm 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你把两个test.class弄成不一样试下就知道了啊,我也好奇这个问题。另外我知道的一些容器是自己改写了class loader的。像tomcat,war包里的jar会优先load到。如有两个版本的jar, tomcat lib下是老版本的,war里的新的,你的应用会访问到新版本的 其实我试验过了,我把Test.class打成jar包放到ext目下之后,在Test.java里添加了一个输出,然后执行,不过结果让我更困惑了1. 通过命令行java Test 执行,发现打印了输出语句,这说明是修改后的Test。 (难道ext目录下的Test没用吗???)2. 通过IDE(IntelliJ IDEA)执行,没有输出,是ext下的Test……(这……) 你IDE用的jdk和系统用的是一个吗? 你启发我了。IDE和命令行结果不一致是因为他们用的不是一个jre。IDE用的是%JAVA_HOME%/jdk1.6.0_45/jre而命令行用的是%JAVA_HOME%/jre我之前是吧test.jar放到了%JAVA_HOME%/jdk1.6.0_45/jre里面的lib/etc下,而IDE用的正是这个,所以不显示输出,而命令行没有。 都没搞明白你main方法是写在哪里的? 你到底想测试什么。首先类只有被用到才会被加载, main方法定义的那个类肯定会被加载。 所以如果你定义main方法的那个类里面只有一句输出,根本都不会加载ext下面的东西。 再有类加载是按照全限定名来的, 如果你jar包里面的Test类跟测试的Test类全限定名都一样的话,且里面都定义了main方法, 我可以负责任的告诉你,jvm只会加载运行ext下面的Test.main, 而你自己的Test类根本都不会被加载 我之前搞错了一点,ExtClassLoader加载的类位于%JAVA_HOME%/jre/lib/etc,而我把打包好的jar放到了%JAVA_HOME%/jdk1.6.0_45/jre/lib/etc里。纠正了这个错误后,实验结果正好相反。1. 用命令行执行没有输出,说明jvm加载到了jar包里的Test.class。2. 用IDE有输出,说明加载的是最新的修改后的Test 全限定名一样的。的确,我做实验也验证了修改后的Test类没有被加载,jvm只会加载ext下面的Test。所以无论在什么路径下,执行java Test 都不会有问题,因为jvm会在ext目录下找到Test.main。自己写的Test被“屏蔽了”,压根没用。 还是sql问题,两次调用自定义function结果如何求和? 背景变色!!!!急急急!! 关于使用java.util.concurrent包时遇到的几个问题 unix 上安装java的问题 爬虫抓取带session的页面 怎么把JTextArea中的内容导出到Excel文件中 java有没有可以显示,编辑Word文档的控件 一个数据库更新问题~~~~在线求解~~~ ■请问:如何在HTML中指定字体? 那地方能够下载到21天学通 byte[1024] 这个有多大 求帮助!大作业要写一个信息管理系统,怎样才能让不同用户的信息显示在自己的界面上啊,本人菜鸟。
其实我试验过了,我把Test.class打成jar包放到ext目下之后,在Test.java里添加了一个输出,然后执行,不过结果让我更困惑了
1. 通过命令行java Test 执行,发现打印了输出语句,这说明是修改后的Test。 (难道ext目录下的Test没用吗???)
2. 通过IDE(IntelliJ IDEA)执行,没有输出,是ext下的Test……(这……)
你启发我了。IDE和命令行结果不一致是因为他们用的不是一个jre。
IDE用的是%JAVA_HOME%/jdk1.6.0_45/jre
而命令行用的是%JAVA_HOME%/jre
我之前是吧test.jar放到了%JAVA_HOME%/jdk1.6.0_45/jre里面的lib/etc下,而IDE用的正是这个,所以不显示输出,而命令行没有。
所以如果你定义main方法的那个类里面只有一句输出,根本都不会加载ext下面的东西。 再有类加载是按照全限定名来的, 如果你jar包里面的Test类跟测试的Test类全限定名都一样的话,且里面都定义了main方法, 我可以负责任的告诉你,jvm只会加载运行ext下面的Test.main, 而你自己的Test类根本都不会被加载
我之前搞错了一点,ExtClassLoader加载的类位于%JAVA_HOME%/jre/lib/etc,而我把打包好的jar放到了%JAVA_HOME%/jdk1.6.0_45/jre/lib/etc里。纠正了这个错误后,实验结果正好相反。
1. 用命令行执行没有输出,说明jvm加载到了jar包里的Test.class。
2. 用IDE有输出,说明加载的是最新的修改后的Test
全限定名一样的。
的确,我做实验也验证了修改后的Test类没有被加载,jvm只会加载ext下面的Test。
所以无论在什么路径下,执行java Test 都不会有问题,因为jvm会在ext目录下找到Test.main。自己写的Test被“屏蔽了”,压根没用。