动态代理(学过反射的一看就懂)

文章介绍了Java中如何创建接口及其实现,然后焦点转向动态代理的生成,通过ProxyInvocationHandler类实现InvocationHandler接口,利用反射机制在运行时动态创建代理对象,并在调用方法时进行额外操作。
摘要由CSDN通过智能技术生成

首先创建接口

//租房接口
public interface Rent {

    //租房方法
    void rent();
}

实现接口方法 

//房东
public class Host implements Rent{

    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}

重点来了,创建一个生成动态代理的类


public class ProxyInvocationHandler implements InvocationHandler {

    private Rent rent;//自定义需要代理的 接口,也可以是Object类,new的时候可以再 强转

    //生成set方法用来注入 动态对象
    public void setRent(Rent rent) {
        this.rent = rent;
    }

    public Object getProxy()
    {
        /*生成得到代理类 --自定义方法
        通过Proxy.newProxyInstance()方法
        参数1---是ClassLoader-----通过this.getClass().getClassLoader()获得--this其实就是这个实现类本身)
        参数2---是newClass就是你要代理的 接口 是谁??通过.getClass().getInterfaces()得到接口
        参数3---是InvocationHandler接口本身--用this就可以
        */
        Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
        return o;
    }

    //重写实现 (必须)  InvocationHandler接口方法 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        //通过method反射对象的invoke方法 ,执行需要的方法
        //第一个参数,接口或者实例对象,第二个是参数-----有没有感觉很熟悉,其实就是通过反射的机制
        Object invoke = method.invoke(rent, args);
        return invoke;
    }
}

测试

  public static void main(String[] args)
    {
        //真实对象
        Host host = new Host();

        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //调用 set方法传入 真实对象
        pih.setRent(host);
        //通过 get方法 获得对象
        Rent proxy = (Rent) pih.getProxy();

        proxy.rent();


    }

学过反射 只要用过 invoke()方法,就能看懂原理,其实很简单

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一剑封喉の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值