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

2022/4/28 6:14:29

本文主要是介绍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)其他网络资料



这篇关于2022-04-28-设计模式之代理模式-JDK动态代理模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程