动态代理

1、静态代理

1、代理对象的一个接口只用于一种类型的对象,如果要代理的方法很多,静态代理在程序规模稍大时就无法胜任

2、如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。


interface Sale{
    public void sell();
}
class Owner implements Sale{
    @Override
    public void sell() {
        System.out.println("房东销售房。。。。。。");
    }   
}
class Agent implements Sale{
    private  Owner owner=new Owner();

    @Override
    public void sell() {
        System.out.println("中介介绍");
        owner.sell();
        System.out.println("中介收费");
    }
public class Test {
    public static void main(String[] args) {
            Agent agent =new Agent();
            agent.sell();
    }
}


2、动态代理

1.动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。
2.动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。

//实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler{
    //目标对象
    private Object target;
    public MyInvocationHandler(Object target){
        super();
        this.target=target;
    }

    //代理实例、方法、参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("before。。。。。。");

        Object result=method.invoke(target, args);

        System.out.println("after。。。。。。");


        return result;
    }

    public Object getProxy(){
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
    }
}

interface Service{
    public void  add();
}
class ServiceImpl implements Service{
    @Override
    public void add() {
        System.out.println("add target。。。。。。");
    }
}
public class Test {
    public static void main(String[] args) {
        Service user=new ServiceImpl();
        MyInvocationHandler myInvocationHandler=new MyInvocationHandler(user);
        //从代理中获取对象
        Service proxy=(Service) myInvocationHandler.getProxy();
        proxy.add();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值