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.csdn.net/J080624/article/details/81945043

你可能感兴趣的:(java)