所谓动态代理,就是指代替其他业务完成某些通用的功能,比如日志输出,事物开启与关闭等。
1.首先建立一个代理类
InsertProxyInvocation
,实现InvocationHandler接口。
实现它的invoke方法
<pre name="code" class="html"><span style="font-size:18px;"> @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try{
logger.log(Level.INFO,"开始执行");//日志输出
<span style="color:#33CC00;">result = method.invoke(delegate, args);//利用java反射机制为方法传参,
//这里具体的方法为insert()</span>
logger.log(Level.INFO,"结束执行");//日志输出
}
catch(Exception e){
logger.log(Level.INFO,e.toString()+"出现异常");
}
return result;
}</span>
其中绿色部分即为具体业务。
在代理类中还有bind方法,用来传入实现业务逻辑的类。
public Object bind(Object delegate){
this.delegate = delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), this);
}
调用方法如下:
InsertProxyInvocation invocation = new InsertProxyInvocation();
<span style="font-size:18px;"></span><pre name="code" class="html">Insert proxy = (Insert) invocation.bind(new InsertImpl());
proxy.insert();//实现具体业务逻辑
这样就实现了日志的代理输出。