在Java中,可以使用相对路径来加载类。具体步骤如下:
1. 获取当前线程的`ClassLoader`对象,通常是`Thread.currentThread().getContextClassLoader()`。
2. 使用`ClassLoader.getResource()`方法获取类文件的URL,例如:
```java
URL url = classLoader.getResource("com/example/MyClass.class");
```
上述代码将会在`classpath`中查找名为`com.example.MyClass`的类文件,并返回其URL。
3. 使用`URLClassLoader`类创建一个新的类加载器,并将上一步获取到的URL作为参数传入,例如:
```java
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {url}, classLoader);
```
上述代码创建了一个新的`URLClassLoader`对象,并将上一步获取到的URL作为唯一的类路径,同时指定父类加载器为当前线程的类加载器。
4. 使用新的类加载器加载目标类,例如:
```java
Class> clazz = urlClassLoader.loadClass("com.example.MyClass");
```
上述代码使用新的类加载器加载名为`com.example.MyClass`的类,并返回其`Class`对象。
完整示例代码如下:
```java
public class Main {
public static void main(String[] args) throws Exception {
// 获取当前线程的ClassLoader对象
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// 获取类文件的URL
URL url = classLoader.getResource("com/example/MyClass.class");
// 创建新的URLClassLoader对象
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {url}, classLoader);
// 加载目标类
Class> clazz = urlClassLoader.loadClass("com.example.MyClass");
// 创建实例并调用方法
Object obj = clazz.newInstance();
Method method = clazz.getMethod("hello");
method.invoke(obj);
}
}
```
上述代码通过相对路径加载了名为`com.example.MyClass`的类,并成功调用了其中的`hello()`方法。需要注意的是,相对路径是相对于`classpath`的根目录来计算的,因此