代码展示了一个自定义的类加载器 FileClassLoader
的使用,以及如何通过这个类加载器加载并调用一个 Message
类的方法。下面是对代码的详细解释:
-
Main
类
- 在
main
方法中,创建了一个 FileClassLoader
实例。 - 使用
FileClassLoader
加载了 Message
类。 - 通过反射创建了
Message
类的实例,并调用了 echo
方法。 - 打印了
echo
方法的返回值。
-
Message
类
- 这个类有一个
echo
方法,该方法接受一个字符串参数并返回一个拼接了前缀的字符串。
-
FileClassLoader
类
- 继承自
ClassLoader
,用于从文件系统中加载 Message
类。 loadData
方法:加载类文件并定义类。loadFileClassData
方法:从指定路径读取类文件的字节数据。
public class Main {
public static void main(String[] args) throws Exception {
FileClassLoader fc = new FileClassLoader();
Class<?> clazz = fc.loadClass("acc.Message");
Object messageObject = clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getMethod("echo", String.class);
System.out.println(method.invoke(messageObject, "zidingyiwenjainleijaizaiqi.acc"));
}
}
FileClassLoader fc = new FileClassLoader();
:创建自定义的类加载器实例。Class<?> clazz = fc.loadClass("acc.Message");
:使用自定义的类加载器加载 acc.Message
类。acc
是类的包名,Message
是类名。Object messageObject = clazz.getDeclaredConstructor().newInstance();
:通过反射创建 Message
类的实例。Method method = clazz.getMethod("echo", String.class);
:通过反射获取 Message
类中 echo
方法的 Method
对象。System.out.println(method.invoke(messageObject, "zidingyiwenjainleijaizaiqi.acc"));
:调用 echo
方法并打印其返回值。 public class Message {
public String echo(String msg) {
return "【echo】" + msg;
}
}
Message
类有一个 echo
方法,接受一个字符串参数 msg
,并返回拼接了 【echo】
前缀的字符串。 public class FileClassLoader extends ClassLoader {
private static final String CLASS_FILE_PATH = "E:" + File.separator + "Message.class";
public Class<?> loadData(String className) throws Exception {
byte data[] = this.loadFileClassData();
if (data != null) {
return super.defineClass(className, data, 0, data.length);
}
return null;
}
private byte[] loadFileClassData() throws Exception {
File file = new File(CLASS_FILE_PATH);
if (!file.exists()) {
file.getParentFile().mkdir();
file.createNewFile();
}
InputStream input = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
input.transferTo(bos);
byte data[] = bos.toByteArray();
input.close();
bos.close();
return data;
}
}
CLASS_FILE_PATH
:指定了 Message
类文件的路径。loadData(String className)
:读取类文件的字节数据,并调用 defineClass
方法定义类。loadFileClassData()
:从指定路径读取 Message
类的字节数据。如果文件不存在,会创建它。