动态代理

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 }

原文地址:https://www.cnblogs.com/xiaostudy/p/9535015.html