Java动态代理学习笔记newProxyInstance

JDK动态代理:基于jdk的动态代理是基于接口实现的,如果被代理对象没有实现接口则不能完成代理。

1.1 定义一个外卖接口:

public interface TakeoutService {
    public void sendtoaddress(String address);
}

1.2 外卖员实现:

public class ClerkService implements TakeoutService {
    @Override
    public void sendtoaddress(String address) {
        System.out.println("your food has arrived."+address);
    }
}

1.3 定义控制器即InvocationHandler:

public class MyInvocationHandler implements InvocationHandler {
    Object object;
    public MyInvocationHandler(Object object) {
        this.object = object;
    }
    //proxy 代理对象
    //method 代理对象调用的方法
    //args 调用的方法中的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    	//反射获取信息
        Object object = method.invoke(this.object,args);
        return object;
    }
}

1.4 测试类:

public class Main {

    public static void main(String[] args) {
        TakeoutService clerkService = new ClerkService();
        TakeoutService proxyclerkService = (TakeoutService) Proxy.newProxyInstance(
                clerkService.getClass().getClassLoader(),
                clerkService.getClass().getInterfaces(),
                new MyInvocationHandler(clerkService));
        proxyclerkService.sendtoaddress("home");
    }
}

1.5 执行情况
Proxy.newProxyInstance 生成代理对象,在调用代理对象的方法时,实际上是执行MyInvocationHandler里面的invoke方法。需要注意的是,InvocationHandler不是代理对象,只是一个辅助类。真正的代理对象是Proxy.newProxyInstance动态生成的。

每个代理的实例都有一个与之关联的 InvocationHandler 实现类,如果代理的方法被调用,那么代理便会通知和转发给内部的 InvocationHandler 实现类的invoke方法,由它决定处理。

源码分析:JDK动态代理最重要的接口为Proxy.newProxyInstance

    public static Object newProxyInstance(ClassLoader loader, //类加载器
                                          Class<?>[] interfaces, //代理的接口
                                          InvocationHandler h) //控制器,代理对象实现被代理对象方法

参考:
【1】https://blog.youkuaiyun.com/J080624/article/details/81945043

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值