已解决【IllegalArgumentException: Superclass has no null constructors but no arguments were given】

项目场景:

准备使用使用Cglib对FileWrite、BufferedWriter的close进行代理,以研究try-with-resource自动关闭资源的先后顺序。


问题描述

写了如下代码:

  • 因为需要代理对象,因此需要创建FileWriter 、BufferedWriter 对象;一旦创建要关闭,因此使用了try-with-resource自动关闭
  • 分别对FileWriter 、BufferedWriter的close方法做增强
  • 内层嵌套try-with-resource创建代理对象,以检验谁先被关闭
try (FileWriter fileWriter = new FileWriter("fw.txt");
     BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {
    // 代理FileWriter的close方法
    Enhancer fwEnhancer = new Enhancer();
    fwEnhancer.setSuperclass(FileWriter.class);
    fwEnhancer.setCallback(new MethodInterceptor() {
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            if ("close".equals(method.getName())) {
                System.out.println("fw  close...");
            }
            return method.invoke(fileWriter, objects);
        }
    });


    // 代理BufferedWriter的close方法
    Enhancer bwEnhancer = new Enhancer();
    bwEnhancer.setSuperclass(BufferedWriter.class);
    bwEnhancer.setCallback(new MethodInterceptor() {
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            if ("close".equals(method.getName())) {
                System.out.println("bw  close...");
            }
            return method.invoke(bufferedWriter, objects);
        }
    });


    //检验谁先被关闭
    try (FileWriter myFw = (FileWriter) fwEnhancer.create();
         BufferedWriter myBw = (BufferedWriter) bwEnhancer.create()) {
        //...
    }
} catch (IOException e) {
    e.printStackTrace();
}
    

结果报异常:
在这里插入图片描述
异常位置位于:
FileWriter myFw = (FileWriter) fwEnhancer.create();


原因分析:

原因大概说父类没有空参构造对象,去看一眼:
在这里插入图片描述
因此,想要代理该对象,可以考虑给他弄一个空参对象,显然不可能。那么只能从Enhancer的create入手了,期待它在创建对象的时候能够传参数。


解决方案:

如图,Enhancer中还有一个create的重构方法:
在这里插入图片描述
传两个参数:

  • Class[] argumentTypes,构造器对应的参数类型
  • Object[] arguments,构造器对应的参数

修改上文中的FileWriter、BufferedWriter ,在create的时候带上参数即可:

FileWriter myFw = 
	(FileWriter) fwEnhancer.create(new Class[]{String.class}, new String[]{"fr.txt"});
BufferedWriter myBw =  
	(BufferedWriter) bwEnhancer.create(new Class[]{Writer.class}, new FileWriter[]{myFw})

注意:构造器是什么类型,new class就写什么类型;

  • 例如:BufferedWriter的一个构造器:
    在这里插入图片描述

  • 要的是Writer.class类型,写它的子类:FileWrite.class也不行;但是传参数的时候,可以写FileWriter类型的参数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值