项目场景:
准备使用使用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类型的参数