package urlclassloader;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import org.junit.Test;
// 在DOS下运行的时候classpath为classes目录
/*
URLClassLoader API的解释是:
该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。
这里假定任何以 '/' 结束的 URL 都是指向目录的。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件
不过从测试程序来看, 不完全符合.
1. 程序运行时, 如果要从当前的classpath中加载一个类, 那么在URL中指定目录时, 最后是否加"/"都没问题.
2. 加载除了classpath外的目录, 那么必须在最后面加上"/", 不过从测试中也可以看出, 我们仍然能够从当前的classpath中加载某个类
3. 如果用File的toURL()方法, 那么在指定File时最后是否加"/"都是没有问题的
*/
public class URLClassLoaderTest {
String rt = "\r\n";
/*
测试classes目录
*/
@Test
public void test() {
System.out.println("==========test=========");
try {
URL[] urls = new URL[] {
new URL("file:" + System.getProperty("user.dir") + "/classes") // classpath就是目前项目的classpath
// new URL("file:" + System.getProperty("user.dir") + "/classes/")
};
for(URL u : urls) {
System.out.println(u.toString());
}
URLClassLoader ul = new URLClassLoader(urls);
Class<?> c = ul.loadClass("urlclassloader.test.Test");
System.out.println(c);
System.out.println("==========test=========" + rt);
} catch (Exception e) {
System.out.println("test() : " + e + rt);
}
}
/*
以下均为测试urlclassloaderpath目录, 和urlclassloaderpath后面是否加"/"
*/
@Test
public void test2() {
try {
System.out.println("==========test2=========");
URL[] urls = new URL[] {
new URL("file:/" + System.getProperty("user.dir") + "/urlclassloaderpath")
// new URL("file:/" + System.getProperty("user.dir") + "/urlclassloaderpath/")
};
for(URL u : urls) {
System.out.println(u.toString());
}
URLClassLoader ul = new URLClassLoader(urls);
/*
* 在URL中,
* 如果写成"/urlclassloaderpath"会出现java.lang.ClassNotFoundException
* 如果写成"/urlclassloaderpath/"则可以正常运行
*/
Class<?> c = ul.loadClass("hello.HelloWorld");
System.out.println(c);
// 加载urlclassloaderpath目录, 虽然Test不在这个urlclassloaderpath目录下,
// 但是我们运行的classpath是在classes目录, 所以仍然是可以加载的
c = ul.loadClass("urlclassloader.test.Test");
System.out.println(c);
System.out.println("==========test2=========" + rt);
} catch (Exception e) {
System.out.println("test2():" + e + rt);
}
}
// 使用File的toURL()
@Test
public void test3() {
try {
System.out.println("==========test3=========");
File file = new File(System.getProperty("user.dir") + "/urlclassloaderpath");
// 使用file.toURL():在urlclassloaderpath后面自动加上了/
System.out.println(file.toURL());
URLClassLoader ul = new URLClassLoader(
new URL[] {file.toURL()},ClassLoader.getSystemClassLoader());
Class<?> c = ul.loadClass("hello.HelloWorld");
System.out.println(c);
System.out.println("==========test3=========" + rt);
} catch (Exception e) {
System.out.println("test3():" + e + rt);
}
}
// 直接给出完整的路径
@Test
public void test4() {
try {
System.out.println("==========test4=========");
URL[] urls = new URL[] {
// new URL("file:/E:/Java/git/yklovejava/jvm/classloader/urlclassloaderpath/")
new URL("file:/E:/Java/git/yklovejava/jvm/classloader/urlclassloaderpath")
};
for(URL u : urls) {
System.out.println(u.toString());
}
/*
* 在URL中,
* 如果写成"urlclassloaderpath"会出现java.lang.ClassNotFoundException
* 如果写成"urlclassloaderpath/"则可以正常运行
*/
URLClassLoader ul = new URLClassLoader(urls);
Class<?> c = ul.loadClass("hello.HelloWorld");
System.out.println(c);
System.out.println("==========test4=========" + rt);
} catch (Exception e) {
System.out.println("test4():" + e + rt);
}
}
// 直接给出完整的路径
@Test
public void test5() {
try {
System.out.println("==========test5=========");
URL[] urls = new URL[] {
new URL("file:/E:\\Java\\git\\yklovejava\\jvm\\classloader\\urlclassloaderpath")
// new URL("file:/E:\\Java\\git\\yklovejava\\jvm\\classloader\\urlclassloaderpath\\")
};
for(URL u : urls) {
System.out.println(u.toString());
}
/*
* 在URL中,
* 如果写成"urlclassloaderpath"会出现java.lang.ClassNotFoundException
* 如果写成"urlclassloaderpath\\"则可以正常运行
*/
URLClassLoader ul = new URLClassLoader(urls);
Class<?> c = ul.loadClass("hello.HelloWorld");
System.out.println(c);
System.out.println("==========test5=========" + rt);
} catch (Exception e) {
System.out.println("test5():" + e + rt);
}
}
}
URLClassLoader中指定目录和jar的问题
需积分: 46 69 浏览量
2019-04-14
01:08:32
上传
评论
收藏 209KB ZIP 举报
weixin_38669628
- 粉丝: 383
- 资源: 6万+
最新资源
- 基于SpringBoot Mybatis-Plus TypeScript的微服务多租户SaaS管理快速开发框架 .zip
- 论文复现:QA-GNN: Reasoning with Language Models and Knowledge
- ipp(intel-oneAPI)下载地址.txt
- 基于spring-boot dubbox搭建的java分布式系统的前端管理.zip
- VLC+Qt demoVLC+Qt demo
- 海彪&龙梅子 - 寂寞的人伤心的歌 (DJ版) [mqms2].ogg
- 530springboot + vue 旅游管理系统.zip(可运行源码+数据库文件+文档)
- 基于SpringBoot + Thymeleaf + Layui + Apache Shiro 的后台管理系统 .zip
- 表1:长江大学文理学院课外学分申请表.et
- base.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈