中孚信息校招笔试遇到的
import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* @Author: 软件171 邱忠玉 201707163
* @Date: 2020/9/20 10:04
*/
public class Main {
public static void main(String[] args) {
//第一种方式
System.out.println(System.getProperty("java.class.path"));
//第二种方式(利用类加载器)
String realPath = getRealPath(Main.class);
System.out.println(realPath);
}
public static String getRealPath(Class clazz) {
//判断是否为空
Class aClass = Optional.of(clazz).orElseThrow(() -> new IllegalArgumentException("参数不能为空!"));
//获得类加载器
ClassLoader classLoader = aClass.getClassLoader();
//获得类的全名,包括包名
String clazzName = aClass.getName() + ".class";
//获得该类所在的包名
Package aPackage = aClass.getPackage();
String packName = Optional.of(aPackage).map(Package::getName).filter(s -> !s.startsWith("java")).filter(s -> !s.startsWith("javax")).orElseThrow(() -> new IllegalArgumentException("不要传递系统类!"));
//获得类的文件名
String className = clazzName.substring(packName.length() == 0 ? 0 : packName.length() + 1);
//将包名转化成相对路径
String path = "";
if (packName.equals("")) {
} else if (!packName.contains(".")) {
path = packName + File.separator;
} else {
path = path + packName.replaceAll(".", File.separator);
path = path + File.separator;
}
//利用getResource得到当前的类文件所在URL
URL url = classLoader.getResource(path + className);
//利用URL解析出当前Java程序所在的路径
String realPath = Optional.ofNullable(url).map((s) -> URLDecoder.decode(s.getPath().substring(1), StandardCharsets.UTF_8)).
map(s -> s.substring(0, s.indexOf(className) - 1)).orElseThrow(() -> new RuntimeException("url解析失败!!"));
return realPath;
}
}
ps:理解class.getClassLoader().getResource()和class.getResource()区别
1. class.getClassLoader().getResource(String name)
默认从classpath中找文件(文件放在resources目录下),name不能带“/”,否则会抛空指针
2. class.getResource(String name)
如果name以"/"开头,那么绝对路径是/后边跟的名字
如果name不是以"/"开头,那么绝对路径是package名"."换成“/”以后再加name。