前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代理模式

代理模式

原创
作者头像
HLee
修改2021-05-26 11:18:45
1970
修改2021-05-26 11:18:45
举报
文章被收录于专栏:房东的猫房东的猫

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

静态代理

代码语言:javascript
复制
public interface House {
    void buyHosue();
}
代码语言:javascript
复制
public class BuyHouse implements House {

    @Override
    public void buyHosue() {
        System.out.println("我要买房");
    }
}
代码语言:javascript
复制
public class BuyHouseProxy implements House {

    private House house;

    public BuyHouseProxy(final House house) {
        this.house = house;
    }

    @Override
    public void buyHosue() {
        System.out.println("买房前准备");
        house.buyHosue();
        System.out.println("买房后装修");

    }
}
代码语言:javascript
复制
public class ProxyTest {
    public static void main(String[] args) {
        House house = new BuyHouse();
        house.buyHosue();
        
        BuyHouseProxy buyHouseProxy = new BuyHouseProxy(house);
        buyHouseProxy.buyHosue();
    }
}

动态代理

代码语言:javascript
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {

    private Object object;

    public DynamicProxyHandler(final Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("买房前准备");
        Object result = method.invoke(object, args);
        System.out.println("买房后装修");
        return result;
    }
}
代码语言:javascript
复制
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
    public static void main(String[] args) {
        House house = new BuyHouse();
        House proxyBuyHouse = (House) Proxy.newProxyInstance(House.class.getClassLoader(), new
                Class[]{House.class}, new DynamicProxyHandler(house));
        proxyBuyHouse.buyHosue();
    }
}

注意Proxy.newProxyInstance()方法接受三个参数:

  • ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法是固定的
  • Class<?>[] interfaces:指定目标对象实现的接口的类型,使用泛型方式确认类型
  • InvocationHandler:指定动态处理器,执行目标对象的方法时,会触发事件处理器的方法

CGLIB动态代理

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 静态代理
  • 动态代理
  • CGLIB动态代理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档