代理模式

来源:互联网 发布:ubuntu 卸载自带jdk 编辑:程序博客网 时间:2024/05/16 13:47

1、定义
给某一个对象提供一个代理,由代理对象来控制对原对象的访问。

2、java.lang.Proxy

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;interface Dao {    public void update();    public void insert();}class JdbcDao implements Dao {    @Override    public void update() {        System.out.println("in jdbc update");    }    @Override    public void insert() {        System.out.println("in jdbc insert");    }}class HibernateDao implements Dao {    @Override    public void update() {        System.out.println("in hibernate update");    }    @Override    public void insert() {        System.out.println("in hibernate insert");    }}class MyInvocationHandler implements InvocationHandler {    Object obj;    // 构造代理对象    public Object get(Object obj) {        this.obj = obj;        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);    }    @Override    public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {        System.out.println("before invoke...");        // invoke执行原对象的方法        Object result = arg1.invoke(obj, arg2);        System.out.println("after invoke...");        return result;    }}public class ProxyTest {    public static void main(String[] args) {        Dao dao = new JdbcDao();        MyInvocationHandler handler = new MyInvocationHandler();        // InvocationHandler类可生成代理对象        Dao daoProxy = (Dao) handler.get(dao);        // 输出代理对象        System.out.println("dynamic proxy's name: " + daoProxy.getClass().getName());        // 执行代理对象的方法        daoProxy.insert();        daoProxy.update();    }}

输出:

dynamic proxy's name: test.$Proxy0before invoke...in jdbc insertafter invoke...before invoke...in jdbc updateafter invoke...
原创粉丝点击