Java 动态代理(1)

作者: e244fad16d0f | 来源:发表于2017-10-08 14:18 被阅读22次

代理模式即Proxy Pattern,23种常用的面向对象软件的设计模式之一。 Java的动态代理比代理的思想更像前迈进了一步,因为他可以动态的代理并且动态的处理对代理方法的调用。在动态代理商的所作的所有调用都会被重新定向定义到单一的调用处理器上,它的工作是揭示调用类型并确定相对应的对策 ( 上面都是Thinking in Java 上面说的

举个例子

public class Clerk {
   public int sell() {
       System.out.print("店铺上新");
       return 0;
   }
}

public class Shop {
   private Clerk clerk;
   public void sell() {
       clerk.sell();
   }
}

上述例子在运行shop的sell方法的时候会输出 “店铺上新” ,如果我们要修改clerk说的话或者修改别的,那样子就要修改Clerk类,我们知道这样很不优雅,所以我们把Clerk的实现变为interface,如果将来需要扩展的话,我们实现这个Clerk接口就行了,接着我们还可以做一个代理Clerk,将我们需要调用的Clerk传过去,让代理Clerk来进行sell操作,在这个sell方法的前后添加代码,但是不改动原有代码。是不是很优雅?

interface Clerk {
   int sell();
}

public class NewClerk implements Clerk {

   public int sell() {
        System.out.println("店铺上新啊");
        return 0;
   }

}

public class ProxyClerk implements Clerk {

   private Clerk clerk;
   public ProxySellFisher(Clerk clerk) {
       this.clerk = clerk;
   }
   public int sellFish() {
       System.out.println("双十一优惠???");
       return sell.sellFish();
   }

}

上面讲的其实都是设计模式的代理,别的语言其实也行,重点其实是Java的动态代理,为什么说Java的动态代理比代理模式要优雅呢,因为Java在Proxy类中已经实现了这个模式,只不过它叫动态代理,因为它的代理类名字叫InvocationHandler了,执行的方法是invoke,再举个🌰 ???顺便引用下百度百科动态代理和静态代理的区别

静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

public class NewClerk implements Clerk {
   public int sell() {
       System.out.println("店铺上新啊");
       return 0;
   }
}

public class ProxyClerk implements InvocationHandler {

   private Clerk clerk;

   public ProxyClerk(Clerk clerk) {
           this.clerk = clerk;
       }

   @Override
   public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
       System.out.println("双十一优惠???");
       return (Integer) method.invoke(sell, args);
   }

}

public class ShopCase {
   public static void main(String args[]) {
       NewClerk c = new NewClerk();
       InvocationHandler p = new ProxyClerk(c);
       NewClerk obj =(NewClerk)  Proxy.newProxyInstance(c.getClass().getClassLoader(),c.getClass().getInterfaces(), p);
       obj.sell();
   }
}

上述代码实现了一个接口InvocationHandler,并重写了它的invoke方法 这个方法利用java反射机制对传入的对象调用了sell方法

NewClerk obj =(NewClerk) Proxy.newProxyInstance(c.getClass().getClassLoader(),c.getClass().getInterfaces(), p);

当我们执行这条语句的时候,会把c下面的方法在p里面添加了代理。最后由newProxyInstance 返回生成的对象。

最后感觉依赖注入其实和代理模式有点像诶。

相关文章

  • Java 动态代理

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

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • java 动态代理

    1、代理模式 2、java 动态代理2.1 InvocationHandler 实现类告诉程序运行动态生成的代理...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • Spring 复盘 | AOP

    Spring AOP 基础 Java 动态代理实现,阅读文章之前,你最好有以下基础: java动态代理 1、什么是...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • Java基础系列-静态代理和动态代理

    原创文章,转载请标注出处:《Java基础系列-静态代理和动态代理》 1、动态代理(Dynamic Proxy) 代...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • Spring AOP源码解析

    欲了解AOP,需先了解Java动态代理;欲了解Java动态代理,先熟悉设计模式之代理模式。入门有道,先从简学。 1...

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

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

网友评论

    本文标题:Java 动态代理(1)

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