关于动态代理的处理,记录备忘。
1:动态代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxy implements InvocationHandler {
private Object object;
public LogHandler() {
// TODO Auto-generated constructor stub
}
//留给外部自己实现bind()转换使用
public LogHandler(Object object) {
super();
this.object = object;
}
//留给外部自己实现bind()转换使用
public void setObject(Object object){
this.object=object;
}
//直接传入类直接代理,内部进行转换
public Object bind(Object obj){
this.object=obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("invoke()执行前。。");//可添加代理方法
Object obj=method.invoke(object, args);
System.out.println("invoke()执行后。。。");//代理方法
return obj;
}
}
2.1:使用代理
①: 要被代理的DeptService类。接口IDeptService两个方法不在写啦
public class DeptService Service implements IDeptService {
@Override
public boolean insert() throws Exception {
// TODO Auto-generated method stub
System.out.println("******insert业务操作*****");
return false;
}
@Override
public boolean delete() throws Exception {
// TODO Auto-generated method stub
System.out.println("******delete业务操作*****");
return false;
}
}
②使用代理
public class Test {
public static void main(String[] args) {
IDeptService ds=(IDeptService) new MyProxy().bing(new DeptServiceImpl());
try {
ds.insert();
ds.delete();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
③输出结果
****准备****
******insert业务操作*****
****结束****
****准备****
******delete业务操作*****
****结束****
2.2 先创建后代理(万一有特殊需求)
使用时下面方式代理就行啦。就是提到外面而已 IDeptService dsi=new DeptServiceImpl();
MyProxy sp= new MyProxy(dsi);
IDeptService ds=(IDeptService) Proxy.newProxyInstance(dsi.getClass().getClassLoader(), dsi.getClass().getInterfaces(), sp);
ds.insert();