• 基于接口和子类的动态代理


    (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 }
  • 相关阅读:
    MySQL的FORMAT函数用法规则
    jetbrains idea/webstorm等(注册,激活,破解码,一起支持正版,最新可用)(2017.3.16更新)【转】
    用户价值模型 CITE :https://www.jianshu.com/p/34199b13ffbc
    用户生命周期模型
    机器学习十大常用算法(CITE 不会停的蜗牛 ) interesting
    Linux 安装Oracle11g完整安装图文教程另附基本操作 (分享)
    oracle 命中率
    SQL学习总结笔记
    hash join
    Tomcat详细安装配置
  • 原文地址:https://www.cnblogs.com/SanChauncy/p/12485187.html
Copyright © 2020-2023  润新知