动态代理分析和实现

动态代理场景:你需要通过一个女孩的家庭人员的同意才可以约女孩出去

动态代理几个关键要素:

1.被代理的接口类

2.被代理接口的实现类

3.代理类,

​ 1)需要把代理接口引入代理类中;

public class FamilyProxy implements InvocationHandler {
    Girl girl;

    public FamilyProxy(Girl girl) {
        this.girl = girl;
    }

​ 2)代理类需要实现InvocationHandler接口,实现invoke方法,invoke方法中的参数需要传入被代理的接口类;

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

​ 3)需加入代理类生成的方法Proxy.newProxyInstance生成一个代理对象,如下:

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

具体实现如下:

接口类:

package com.spring.proxy;

public interface Girl {
    void date();

    void watchMovie();
}

实现类:

package com.spring.proxy;

public class BeatifulGirl implements Girl {
    @Override
    public void date() {
        System.out.println("美丽女孩陪你去约会");
    }

    @Override
    public void watchMovie() {
        System.out.println("美丽女孩陪你去看电影");
    }
}

代理类:

package com.spring.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class FamilyProxy implements InvocationHandler {
    Girl girl;

    public FamilyProxy(Girl girl) {
        this.girl = girl;
    }


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

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

    public void before(){
        System.out.println("约会前的调查");
    }

    public void after(){
        System.out.println("约会后的审问");
    }
}

测试类:

package com.spring.proxy;

public class Test {
    public static void main(String[] args) {
      	//创建目标类
        Girl girl=new BeatifulGirl();
      	//在代理类中注入目标类
        FamilyProxy familyProxy =new FamilyProxy(girl);
      	//获取代理类
        Girl mother = (Girl) familyProxy.getNewInstance();
      	//通过代理类实现目标类的方法
        mother.date();
        System.out.println("=======================");
      	//通过代理类实现目标类的方法
        mother.watchMovie();
    }
}

运行结果:

约会前的调查
美丽女孩陪你去约会
约会后的审问
=======================
约会前的调查
美丽女孩陪你去看电影
约会后的审问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值