Java动态代理类及对象的生成流程

本文详细解析了Java动态代理的工作原理,包括如何通过动态代理类控制对目标对象的访问。从一个购买香烟的例子出发,介绍了动态代理接口、代理类以及InvocationHandler的实现,展示了动态代理类的生成过程,包括Proxy类的newProxyInstance方法、类的字节码生成以及最终的代理对象实例化。文章最后指出,通过动态代理可以实现方法的增强,而无需直接操作目标对象。
摘要由CSDN通过智能技术生成

Java的代理分为静态代理和动态代理,静态代理因为违反开闭原则,一次只能代理一个对象,缺少实用性,所以一般用的很少,所以只记一下动态代理。

动态代理定义:为其它对象提供一种代理以控制对这个对象的访问控制;在某些情况下,客户不想或者不能直接引用另一个对象,这时候代理对象可以在客户端和目标对象之间起到中介的作用。

举一个实际的例子,比如我想要买一包烟,但生产这包烟的是卷烟厂,我不可能直接去卷烟厂去买,所以现在就需要一个商店作为代理,向消费者销售卷烟厂生产的香烟,在这里商店就是代理类。

首先我们写一个SaleTools接口,提供了卖东西的方法。

/**
 * 售卖方式
 */
public interface SaleTools {
    void saleCigarette();
}

然后定义一个实现了SaleTools的类CigarFactory ,我们可以把它看成实际的卷烟厂,通过saleCigarette()方法生产并销售香烟。

/**
 * 卷烟厂
 */
public class CigarFactory implements SaleTools{

    @Override
    public void saleCigarette() {
        System.out.println("----------卖了一包烟");
    }
}

然后定义代理类StoreProxy


/**
 * 商店 代理类
 */
public class StoreProxy implements InvocationHandler {

    private Object factory;

    public void setFactory(Object factory) {
        this.factory = factory;
    }

    void before() {
        System.out.println("----选择品牌,进了一批香烟");
    }

    void after() {
        System.out.println("-----卖完数钱------");
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(factory, args);
        after();
        return result;
    }
}

在这个类里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值