其他分享
首页 > 其他分享> > 2022-04-28-设计模式之代理模式-JDK动态代理模式

2022-04-28-设计模式之代理模式-JDK动态代理模式

作者:互联网

java设计模式之代理模式-JDK动态代理模式学习整理

动态代理(分为JDK动态代理、cglib动态代理)

代理对象不需要实现接口,但是目标对象需要实现接口,否则不能使用动态代理。

是通过JDK的API创建代理对象,动态的创建代理对象。JDK通过反射包下的Proxy类的newProxyInstance方法动态创建代理对象。

动态代理利用了JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。

静态代理与动态代理的区别主要在:
1)静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
2)动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中

Proxy的静态方法获取代理实例:

被代理对象:

关键-两个核心jar包:

JDK动态代理,动态处理器:代理规则(invoke):

JDK动态代理测试类:

执行结果:

代理规则中的invoke方法中的第一个参数Object proxy似乎没有用到。

public Object getProxyInstance(){
/**
* Object newProxyInstance(ClassLoader loader, 目标类(target)的加载器
* Class<?>[] interfaces, 目标类的接口
* InvocationHandler h) 事件处理,调用目标方法时,会触发事件处理方法
*/
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始 。。。");

                    反射机制调用目标对象的方法
                    Object ret = method.invoke(target, args);

                    System.out.println("JDK代理结束 。。。");
                    return ret;
                }
            }
    );
}



@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before calling " + method.getName());
    Object result = method.invoke(object, args);
    System.out.println("after calling " + method.getName());
    return result;
}

参考资料:
1)kkb-wln-teacher直播公开课:
https://www.kaikeba.com/open/item?c=1463
2)其他网络资料

标签:动态,invoke,JDK,Object,代理,模式,设计模式,method
来源: https://www.cnblogs.com/YiMingXiaoBuYiMengXiaoNai/p/DesignModeOfDynamicProxyMode_JDK.html