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 }