动态代理1

为什么:当我想调同样的方法但又不一样的结果,可以使用动态代理,使被调用者没有感觉有改动
所谓动态代理是通过代码给目标类生成代理类

在这里插入图片描述

public class ProxyFac {
    //创建一个被代理的目标对象,因为此时不确定要代理的目标对象是什么类型,所以用object
    private Object obj;

    public ProxyFac(Object obj) {
        this.obj = obj;
    }

    //创建一个对象用来返回代理
    public Object getProxy(){
        //获得代理实例需要传入类加载器(代理对象的),(与被代理对象实现相同)接口数组,执行处理器
        ClassLoader classLoader = ProxyFac.class.getClassLoader();
        Class<?>[] interfaces = obj.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //proxy:代理对象
                //method:执行的方法
                //参数列表
                //跟静态代理模式一样,方法还交还给被代理人做。需要修改的代码通过if判断来修改,或者在方法执行前后也可以加一些操作
                System.out.println("方法执行前。。。。参数:"+ Arrays.toString(args));
                Object result = method.invoke(obj, args);
                System.out.println("方法执行后。。。。结果:"+ result);
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }
}

接口和实现类

public interface Move {
    void move();
}

//代理对象
public class Car implements Move{
    @Override
    public void move() {
        System.out.println("我可以移动");
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        ProxyFac proxyFac = new ProxyFac(new Car());
        //不确定能转成什么类但能确定接口
        Move proxy = (Move)proxyFac.getProxy();
        proxy.move();
    }
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值