zoukankan      html  css  js  c++  java
  • 动态代理

    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 }

  • 相关阅读:
    Python基础之内存管理与垃圾回收机制
    Git常用命令
    Git分支操作
    码云配置SSH公钥
    Git基本操作
    Git基本理论
    版本控制
    Python基础之Python语法
    成为一名JAVA高级工程师你需要学什么【转】
    一个java高级工程师的进阶之路【转】
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/9535015.html
Copyright © 2011-2022 走看看