• 动态代理


    1、被代理类接口Person.java

     1 package com.xiaostudy;
     2 
     3 /**
     4  * @desc 被代理类接口
     5  * 
     6  * @author xiaostudy
     7  *
     8  */
     9 public interface Person {
    10 
    11     public void add();
    12     public void update();
    13     public void delete();
    14 }

    2、被代理类PersonImple.java

     1 package com.xiaostudy;
     2 
     3 /**
     4  * @desc 被代理类
     5  * 
     6  * @author xiaostudy
     7  *
     8  */
     9 public class PersonImple implements Person {
    10 
    11     /**
    12      * @desc 实现接口方法
    13      */
    14     public void add() {
    15         System.out.println("add()>>>>>>>>");
    16     }
    17 
    18     @Override
    19     public void update() {
    20         System.out.println("update()>>>>>>>>");
    21     }
    22 
    23     @Override
    24     public void delete() {
    25         System.out.println("delete()>>>>>>>>");
    26     }
    27     
    28 }

    3、切面类MyAdvice.java,就是代理的内容

     1 package com.xiaostudy;
     2 
     3 /**
     4  * @desc 切面类
     5  * 
     6  * @author xiaostudy
     7  *
     8  */
     9 public class MyAdvice {
    10     
    11     /**
    12      * @desc 植入代理方法的方法
    13      */
    14     public void before() {
    15         System.out.println("日记开始>>>>>>>>>>>");
    16     }
    17     
    18     public void after() {
    19         System.out.println("日记结束<<<<<<<<<<<<");
    20     }
    21 
    22 }

    4、代理工厂类MyBeanFactory.java

     1 package com.xiaostudy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 /**
     8  * @desc 代理工厂类
     9  * 
    10  * @author xiaostudy
    11  *
    12  */
    13 public class MyBeanFactory {
    14     /**
    15      * @desc 获取一个代理的对象
    16      * 
    17      * @return Person对象
    18      */
    19     public static Person createPerson() {
    20         //被代理类
    21         final Person person = new PersonImple();
    22         //切面类
    23         final MyAdvice myAdvice = new MyAdvice();
    24         /*
    25          * 1、第一个参数:loader 类加载器,动态代理类,运行时创建,任何类都需要加载器将其加载到内存
    26          *                 一般情况:当前类.class.getClassLoader() 
    27          * 2、第二个参数:Class[] interfaces,代理类需要实现的所有接口
    28          *                 方法1、被代理类实例.getClass().getInterfaces() 注意:只能获取父类的接口,而不能获取父类的父类接口 
    29          *                 方法2、new Class[]{被代理类.class} 
    30          * 3、第三个参数:InvocationHandler 处理类,这个是接口,要进行实现类,采用匿名内部类     提供invoke()方法,代理类每个方法都要调用一次invoke 
    31          *         3.1、第一个参数:proxy 被代理类对象 
    32          *         3.2、第二个参数:method 代理类对象当前执行的方法的描述对象 
    33          *             执行方法名:method.getName() 
    34          *             执行方法:method.invoke(被代理类对象,实际参数)
    35          *         3.3、第三个参数:方法实际参数
    36          */
    37         return (Person) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(), person.getClass().getInterfaces(),
    38                 new InvocationHandler() {
    39                     @Override
    40                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    41                         myAdvice.before();
    42                         method.invoke(person, args);
    43                         myAdvice.after();
    44                         return proxy;
    45                     }
    46                 });
    47     }
    48 
    49 }

    5、测试类Test.java

     1 package com.xiaostudy;
     2 
     3 /**
     4  * @desc 测试类
     5  * 
     6  * @author xiaostudy
     7  *
     8  */
     9 public class Test {
    10 
    11     public static void main(String[] args) {
    12         Person person = MyBeanFactory.createPerson();
    13         person.add();
    14         person.update();
    15         person.delete();
    16     }
    17 
    18 }

  • 相关阅读:
    javascript学习笔记-数据类型
    chrome console.log API
    Mysql下SELECT的结果集作为UPDATE的WHERE条件时的SQL语法
    Ajax、Comet、Websocket、SSE
    Model View Controller(MVC) in PHP
    区别Transform、Transition、Animation
    WAI-ARIA无障碍网页应用属性完全展示
    理解 PHP output buffer
    清除Jquery动画的队列
    git常用命令
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/9535015.html
Copyright © 2020-2023  润新知