自定义类加载器

代码展示了一个自定义的类加载器 FileClassLoader 的使用,以及如何通过这个类加载器加载并调用一个 Message 类的方法。下面是对代码的详细解释:

  1. Main

    • 在 main 方法中,创建了一个 FileClassLoader 实例。
    • 使用 FileClassLoader 加载了 Message 类。
    • 通过反射创建了 Message 类的实例,并调用了 echo 方法。
    • 打印了 echo 方法的返回值。
  2. Message

    • 这个类有一个 echo 方法,该方法接受一个字符串参数并返回一个拼接了前缀的字符串。
  3. 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 类的字节数据。如果文件不存在,会创建它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值