美文网首页
java代理模式2_动态代理_jdk

java代理模式2_动态代理_jdk

作者: 指下光年 | 来源:发表于2021-10-28 15:56 被阅读0次

动态代理

相对于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由java反射机制动态产生。它会根据需要,通过反射机制在程序运行期,动态的为目标对象创建代理对象,无需手动编写源代码。动态代理简化了编程工作,提高了软件系统的可扩展性,因为反射机制可以生成任意类型的动态代理。代理的行为可以代理多个方法,即满足生产需要的同时又达到代码通用的目的。

动态代理的两种实现方式:
1. JDK 动态代理
2. CGLIB动态代理

  • 动态代理的特点

  1. 目标对象不固定
  2. 在应用程序执行时动态创建目标对象
  3. 代理对象会增强目标对象的行为
JDK 动态代理

注:JDK 动态代理的目标对象必须有接口实现

  • JDK 动态代理

  • 定义接口
public interface RentHouse {
    public String toRentHouse(String name);
}
  • 目标对象
public class ZuKe implements RentHouse{
    @Override
    public String toRentHouse(String name) {
        System.out.println("我要租房,预算5000");
        return "签名:"+name;
    }
}
  • 代理对象
public class JdkProxy {

    //目标对象
    private Object object;
    //构造注入
    public JdkProxy(Object object) {
        this.object = object;
    }

    /**
     * 通过调用proxy代理类中的newProxyInstance(),得到代理对象
     * @return
     */
    public Object getProxy(){
        //定义ClassLoader类加载器
        ClassLoader loader = this.getClass().getClassLoader();
        //要代理的对象提供的接口数组
        Class<?>[] interfaces = object.getClass().getInterfaces();
        //一个InvocationHandler接口,表示代理实例的调用处理程序实现的接口。
        InvocationHandler invocationHandler = new InvocationHandler() {
            /**
             * 当代理对象调用方法时,invoke方法就会被执行一次(InvocationHandler接口中的invoke方法)
             * @param proxy 代理对象
             * @param method 目标方法
             * @param args 目标方法所需要的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("方法执行前。。。。");
                //调用目标对象中的方法  通过反射中的invoke方法,调用指定对象的指定方法
                /**
                 * 反射invoke方法
                 *  方法名.invoke(对象,方法所需参数);
                 */
                Object s = method.invoke(object,args);
                System.out.println("方法执行后。。。。");
                //return的是方法的返回值(目标对象里面的方法)
                return s;
            }
        };
        //调用方法,得到代理对象
        Object instance = Proxy.newProxyInstance(loader, interfaces, invocationHandler);
        return instance;
    }
  • 测试
public class App {
    public static void main( String[] args ) {
        //目标对象
        RentHouse rentHouse = new ZuKe();
        //得到代理对象
        JdkProxy proxy = new JdkProxy(rentHouse);
        //通过代理对象得到方法
        RentHouse rentHouseProxy = (RentHouse)proxy.getProxy();
        String name = "小明";
        String s = rentHouseProxy.toRentHouse(name);
        System.out.println(s);
    }
}

相关文章

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • 设计模式之代理

    设计模式之代理模式 一、定义 在Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态...

  • Spring AOP详解

    AOP AOP的实现一般都是基于 代理模式 ,在JAVA中采用JDK动态代理模式,但是我们都知道,JDK动态代理模...

  • java代理模式2_动态代理_jdk

    动态代理 相对于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由java反射机制动...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • Java学习:Java动态代理(cglib)

    上一篇关于java动态代理的jdk实现中,花了大量篇幅介绍了代理模式和静态代理,最后讲了jdk的动态代理实现,也讲...

  • Java代理模式之CGLIB动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 前面我们了解了JDK动态代理技术,发现其真实对象必...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

网友评论

      本文标题:java代理模式2_动态代理_jdk

      本文链接:https://www.haomeiwen.com/subject/uadvaltx.html