------- android培训、java培训、期待与您交流! ----------
上一篇文章已经总结了静态代理模式,由于实际开发中,对于很多业务类都需要代理的时,以静态代理实现的话,会写很多代码,这些代码也就是垃圾代码,那么JDK中给大家提供了动态代理的功能,这样可以一个代理类,可以有N个业务逻辑类调用,大大节省了程序员们的时间,提高了工作效率,以及减少代码冗余度。那现在根据上一个例子,改成一个动态代理例子
1、定义一个业务逻辑接口类
<div style="text-align: left;"><pre name="code" class="java">package com.proxy.dynamic_proxy;
/*
* 演示动态代理类
*
* 功能:定义一个接口,用于模拟对数据库进行操作
*
* @author lijl
* */
public interface DatabaseInterface {
//插入
public void Insert();
//删除
public void Delete();
//修改
public void Update();
//查询
public void Select();
}
2、定义业务逻辑类
package com.proxy.dynamic_proxy;
/*
* 演示动态代理类
*
* 功能:定义一个实现类,即业务逻辑类
*
* @author lijl
* */
public class DynamicProxyImpl implements DatabaseInterface {
@Override
public void Insert() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Insert()...........");
}
@Override
public void Delete() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Delete()...........");
}
@Override
public void Update() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Update()...........");
}
@Override
public void Select() {
// TODO Auto-generated method stub
System.out.println("StaticProxy_Impl.Select()...........");
}
}
3、定义代理类
package com.proxy.dynamic_proxy;
/*
* 演示动态代理类
*
* 功能:定义一个代理类,实现InvocationHandler接口
* InvocationHandle接口有一个方法:
* public Object invoke(Object peoxy, Method method, Object[] args) throws Throwable{return null}
*
* 其中:
* proxy:逻辑类的对象
* method:通过反射逻辑类对象proxy的方法
* args:调用方法时传递的参数
*
* 每调用本类的对象时候,都会触发invoke这个方法。
*
* @author lijl
* */
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler {
private DynamicProxyImpl dpi;
public DynamicProxy(DynamicProxyImpl dpi){
this.dpi = dpi;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object pi = null;
LogBegin();//将日志放在这里
pi = method.invoke(dpi, args);
LogEnd();//将日志放在这里
// TODO Auto-generated method stub
return pi;
}
private void LogBegin(){
System.out.println("DynamicProxy.LogBegin()");
}
private void LogEnd(){
System.out.println("DynamicProxy.LogEnd()");
}
}
4、主函数执行
package com.proxy.dynamic_proxy;
import java.lang.reflect.Proxy;
public class DynamicProxy_main {
public static void main(String[] args) {
// TODO Auto-generated method stub
DynamicProxyImpl dpi = new DynamicProxyImpl();
DynamicProxy dp = new DynamicProxy(dpi);
//使用Proxy.newProxyInstance,返回动态代理对象
DatabaseInterface di = (DatabaseInterface)Proxy.newProxyInstance(
dpi.getClass().getClassLoader(), //业务逻辑类的加载器
dpi.getClass().getInterfaces(), //业务逻辑类使用的接口,如果多个接口,这个是数组
dp);//实现InvocationHandler的代理类
di.Insert();
di.Select();
di.Update();
di.Delete();
}
}
DynamicProxy.LogBegin()
StaticProxy_Impl.Insert()...........
DynamicProxy.LogEnd()
DynamicProxy.LogBegin()
StaticProxy_Impl.Select()...........
DynamicProxy.LogEnd()
DynamicProxy.LogBegin()
StaticProxy_Impl.Update()...........
DynamicProxy.LogEnd()
DynamicProxy.LogBegin()
StaticProxy_Impl.Delete()...........
DynamicProxy.LogEnd()
-------android培训、JAVA培训、期待与您交流! ----------
--------详细请查看www.itheima.com-------------