Java ClassPath(类加载路径)与资源加载 - Go语言中文社区

Java ClassPath(类加载路径)与资源加载


1)Java ClassPath(类加载路径)

众所周知,Java执行的过程,首先时加载class文件到内存中,然后通过类加载器执行Class的加载过程。ClassPath即搜索class文件的路径,即类加载路径。

2)如何设置ClassPath

① java -classpath 选项设置

命令行或脚本执行Java程序时,通过-classpath选项指定类加载路径,可以是文件夹,或jar文件所在路径,AppClassLoader将加载classpath指定路径下的所有类。

② URLClassLoader中,通过URL的方式定位类加载路径

有兴趣的朋友,可以用tomcat web项目中的class文件做试验。

package org.lin.spl;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class Loader {
	public static void main(String[] args) throws Exception {
		URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {
			new File("lib/abc.jar").toURI().toURL(),	
			new File("WEB-INF/classes").toURI().toURL()
		});
		Class<?> obj = urlClassLoader.loadClass("org.abc.test.Abc");
		System.out.println(obj.getClassLoader());
		urlClassLoader.close();
	}
}

3)ClassPath下资源加载

ClassPath下的class文件,以及properties等配置文件,在运行时都是可以通过Java代码获取的。

提供一个demo项目,作为资源加载的示例:

resources源文件夹下存放着db.properties配置文件,common-lang3-3.8.1.jar被添加到类路径(IDE中添加)。

ClassLoader、Class提供了方便的API获取类路径下资源(获取资源的URL)。也可以自己显示构造URL,并访问.jar文件。

package org.lin.demo;

import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collections;
import java.util.jar.JarFile;

public class Demo {
	public static void main(String[] args) throws Exception {
		//1.通过ClassLoader加载 ClassLoader.getResource、ClassLoader.getResourceAsStream均可
		ClassLoader loader = ClassLoader.getSystemClassLoader();
		//加载配置文件
		System.out.println(loader.getResource("db.properties"));
		//加载class文件
		System.out.println(loader.getResource("org/lin/demo/Demo.class"));
		//jar包内的文件亦可加载
		System.out.println(loader.getResource("org/apache/commons/lang3/StringUtils.class"));
		//ClassLoader加载不能使用绝对路径
		System.out.println(loader.getResource("/db.properties")); //输出null
		
		//2.通过Class加载,内部实际上调用ClassLoader加载
		Class<Demo> clazz = Demo.class;
		//Demo.class所在路径是 org/lin/demo/Demo.class,使用相对路径,起始路径是org/lin/demo
		System.out.println(clazz.getResource(""));
		//Class加载可使用绝对路径
		System.out.println(clazz.getResource("/"));
		//相对路径加载db.properties
		System.out.println(clazz.getResource("../../../db.properties"));
		//绝对路径加载db.properties
		System.out.println(clazz.getResource("/db.properties"));
		
		//3.URL路径方式显示加载Jar文件(前面的getResource返回的亦是URL)对象
		//URL Uniform Resource Locator 统一资源定位符
		//jar协议格式 jar:other/!/entryPath
		URL url = new URL("jar:file:/D:/workspaceForTest/demo/lib/commons-lang3-3.8.1.jar!/");
		//URLConnection是对URL资源访问的封装接口
		URLConnection urlConnection = url.openConnection();
		//jar协议的特定实现
		JarURLConnection jarURLConnection = (JarURLConnection)urlConnection;
		//获取JarFile
		JarFile jarFile = jarURLConnection.getJarFile();
		//把jar中的每个entry打印出来
		Collections.list(jarFile.entries()).forEach(entry -> {
			System.out.println(entry.getName());
		});
		//显示Manifest
		jarFile.getManifest().getMainAttributes().entrySet().forEach(entry -> {
			System.out.println(entry.getKey() + ":" + entry.getValue());
		});
		
		//4.关于user.dir系统属性
		//user.dir 即用户工作目录,意思是执行java命令时,执行环境所在目录
		//eclipse执行java命令时,以项目根目录作为user.dir
		System.out.println(System.getProperty("user.dir"));
	}
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_21508059/article/details/83510070
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 22:13:04
  • 阅读 ( 1344 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢