zoukankan      html  css  js  c++  java
  • 基于接口和子类的动态代理

    (1)基于接口的动态代理

    * 动态代理:
    * 特点:字节码随用随创建,随用随加载
    * 作用:不修改源码的基础上对方法增强
    * 分类:基于接口的动态代理&基于子类的动态代理
    * 基于接口的动态代理:
    * 涉及的类:Proxy
    * 提供者:JDK官方
    * 如何创建代理对象:
    * 使用Proxy类中的newProxyInstance方法
    * 创建代理对象的要求:
    * 被代理类最少实现一个接口,如果没有则不能使用
    * newProxyInstance方法的参数:
    * ClassLoader:类加载器
    * 它是用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法。
    * Class[]:字节码数组
    * 它是用于让代理对象和被代理对象有相同方法。固定写法。
    * InvocationHandler:用于提供增强的代码
    * 它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
    * 此接口的实现类都是谁用谁写。

     1 //Producer.java
     2 public class Producer implements IProducer{
     3     public void saleProduct(float money){
     4         System.out.println("销售产品,并拿到钱"+money);
     5     }
     6     public void afterService(float money){
     7         System.out.println("提供售后服务"+money);
     8     }
     9 }
    10 //IProducer.java
    11 public interface IProducer  {
    12     public void saleProduct(float money);
    13     public void afterService(float money);
    14 }
    15 //Client.java
    16 public class Client {
    17     public static void main(String[] args) {
    18         final Producer producer=new Producer();
    19         IProducer producer1=(IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
    20             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    21                 Object returnValue=null;
    22                 Float money=(Float)args[0];
    23                 if ("saleProduct".equals(method.getName())){
    24                     returnValue= method.invoke(producer,money*0.8F);
    25                 }
    26                 return returnValue;
    27             }
    28         });
    29         producer1.saleProduct(10000F);
    30     }
    31 }

    (2)基于子类的动态代理

    * 基于子类的动态代理:
    * 涉及的类:Enhancer
    * 提供者:第三方cglib库
    * 如何创建代理对象:
    * 使用Enhancer类中的create方法
    * 创建代理对象的要求:
    * 被代理类不能是最终类
    * create方法的参数:
    * Class:字节码
    * 它是用于指定被代理对象的字节码。
    * Callback:用于提供增强的代码
    * 它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
    * 此接口的实现类都是谁用谁写。
    * 我们一般写的都是该接口的子接口实现类:MethodInterceptor

     1 //Producer.java
     2 public class Producer{
     3     public void saleProduct(float money){
     4         System.out.println("销售产品,并拿到钱"+money);
     5     }
     6     public void afterService(float money){
     7         System.out.println("提供售后服务"+money);
     8     }
     9 }
    10 //Client.java
    11 public class Client {
    12     public static void main(final String[] args) {
    13         final Producer producer = new Producer();
    14         Producer producer1= (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
    15             public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    16                 Object returnValue = null;
    17                 Float money=(Float)args[0];
    18                 if ("saleProduct".equals(method.getName())) {
    19                     returnValue = method.invoke(producer, money * 0.8F);
    20                 }
    21                 return returnValue;
    22             }
    23         });
    24         producer1.saleProduct(10000F);
    25     }
    26 }
  • 相关阅读:
    Go语言中的管道(Channel)总结
    Go语言的构建方法总结
    Java里的equals总结
    Cracking the coding interview 第二章问题及解答
    2014年度总结
    一种识别验证码方法的介绍
    由记忆的角度分析我们学习为什么要知其所以然
    pvlan 配置
    f5 数据转发分析
    elasticsearch logstash kibana 研究第一篇
  • 原文地址:https://www.cnblogs.com/SanChauncy/p/12485187.html
Copyright © 2011-2022 走看看