1.获取当前项目的绝对路径
我们来获取 myJdkDynamic 这个项目的绝对路径
这里可以使用系统参数 user.dir
String absolutePath = System.getProperty("user.dir");
System.out.println(absolutePath);
// C:\Users\13275\Documents\Java\Java-project\myJdkDynamic
另外,还可以通过 File 来获取
File f = new File("");
String absolutePath = f.getAbsolutePath()
System.out.println(absolutePath);
// C:\Users\13275\Documents\Java\Java-project\myJdkDynamic
File f = new File(".");
String absolutePath = f.getCanonicalPath()
System.out.println(absolutePath);
// C:\Users\13275\Documents\Java\Java-project\myJdkDynamic
2.获取当前类(class 字节码文件)绝对路径
我们来获取 myJdkDynamic 项目中,Test.class 的绝对路径:
这里可以通过 URL 类来获取
URL resource = Test.class.getResource("");
String absolutePath = resource.getPath();
System.out.println(absolutePath);
// /C:/Users/13275/Documents/Java/Java-project/myJdkDynamic/target/classes/com/yzh/test/
// 注:如果是 getResource("/"),拿到的则是类路径
// /C:/Users/13275/Documents/Java/Java-project/myJdkDynamic/target/classes/
然后,我们就可以创建文件夹的 File 对象,去进行文件操作了。
注:Linux 下文件目录是 /,而 Windows 是 \,但创建 File 对象时,两者都可以作为入参。
1)我们现在已经有当前类所在目录的 File 对象了,如果我们要进一步,拿到某个 .class 文件的 File 对象,比如上面的 Test.class,
可以这样做:
// public File(File parent, String child)
File classFile = new File(classPathFile, "Test.class");
2)再进一步,扫描指定包,得到指定包下所有类的全类名(本质是文件操作)
大致步骤如下:
- 获取 scanPackage 的绝对路径,因为构建 File 的入参不能是包名(比如 com.yzh.test)
- 创建需要扫描包(目录)的 File 对象
- 递归遍历当前目录
private List<String> classNames = new ArrayList<String>();
// 入参 scanPackage 比如 com.yzh.test
private void doScanner(String scanPackage) {
// getResource 获取绝对路径,首先要将包名转化成项目相对路径
// 由于是包名,是相对于项目根目录而言的,所以在转化为 / 后还需要在最前面加上 /
URL url = this.getClass().getClassLoader().getResource("/" + scanPackage.replaceAll("\\.", "/"));
File classpath = new File(url.getFile()); // getFile 拿到绝对路径
// 遍历文件夹,寻找class文件
for (File file : classpath.listFiles()) {
if (file.isDirectory()) {
// 这里是通过递归遍历文件夹,还是包就再执行上述步骤(解析路径->创建目录->遍历)
doScanner(scanPackage + "." + file.getName());
} else {
// 不是class文件的不管
if (!file.getName().endsWith("class")) {continue;}
// 这里要保存全类名(包.类名),因为后面要通过反射Class.forName获取Class对象
String className = (scanPackage + "." + file.getName()).replace(".class", "");
classNames.add(className);
}
}
}