java动态代理--简单易懂

代理模式

​ 代理模式就是为目标对象提供一个代理对象,为了更好的保护和隐藏我们的目标对象,同时也为实施不同控制策略的时候留下空间,控制更具灵活性。

动态代理

​ java的动态代理可以动态的添加代理并且动态处理代理方法的调用,只需要指定一组接口和委托类对象,就能动态获取代理类。

原理

​ 可以举个例子,就比如我要找我朋友出门,但是要先经过他父母的同意,这时候他父母就是代理,我要通过他们,才能得到目标类(朋友)的方法。朋友父母会问要去哪里或者去了哪里,这其实就是为实施不同控制策略留下的操作空间

示例代码
/**
 * @author xuxi
 * @date 2021/3/16
 * @desciption
 **/
public class MyFriend implements SomeMethods{
    private String name;
    private String id;
    private int age;
    private String sex;

    public MyFriend() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public void play() {
        System.out.println("我和xx出去玩了!!!!");
    }
}

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

/**
 * @author xuxi
 * @date 2021/3/16
 * @desciption
 **/
public class MyFriendParents implements InvocationHandler {
    MyFriend myFriend;

    public MyFriendParents(MyFriend myFriend) {
        this.myFriend = myFriend;
    }

/**
*proxy - 调用该方法的代理实例 
*method -所述方法对应于调用代理实例上的接口方法的实例。 方法对象的声明类将*是该方法声明的接口,它可以是代理类继承该方法的代理接口的超级接口。 
*args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法* *没有参数。 */


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //同学父母在放同学出去之前要问清楚去哪里玩了
        System.out.println("你们俩要去哪里玩");

        //同学可以和我出去玩了
        Object o=method.invoke(myFriend,args);

        //同学父母在同学回家后又问他还去了干了啥
        System.out.println("你们俩之后又去哪里玩了");

        return o;
    }
}


import java.lang.reflect.Proxy;

/**
 * @author xuxi
 * @date 2021/3/16
 * @desciption
 **/
public class Me {
    public static void main(String[] args) {
        MyFriend myFriend=new MyFriend();

        //我向同学父母请求放同学出门
        MyFriendParents myFriendParents=new MyFriendParents(myFriend);
        //获得到同意,同学可以出门了
        SomeMethods canGoOut= (SomeMethods) Proxy.newProxyInstance(myFriend.getClass().getClassLoader(),myFriend.getClass().getInterfaces(),myFriendParents);
        //可以和同学一起玩了
        canGoOut.play();

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7k49549-1615895213424)(D:\Typora\image-20210316194521150.png)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值