标签:object string 第一个 ati 实例 类加载器 sys upd final
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 }
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 }
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 }
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() 2、第二个参数:Class[] interfaces,代理类需要实现的所有接口 27 * 方法1、被代理类实例.getClass().getInterfaces() 注意:只能获取父类的接口,而不能获取父类的父类接口 方法2、new 28 * Class[]{被代理类.class} 3、第三个参数:InvocationHandler 处理类,这个是接口,要进行实现类,采用匿名内部类 29 * 提供invoke()方法,代理类每个方法都要调用一次invoke 3.1、第一个参数:proxy 被代理类对象 3.2、第二个参数:method 30 * 代理类对象当前执行的方法的描述对象 执行方法名:method.getName() 执行方法:method.invoke(被代理类对象,实际参数) 31 * 3.3、第三个参数:方法实际参数 32 */ 33 return (Person) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(), person.getClass().getInterfaces(), 34 new InvocationHandler() { 35 @Override 36 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 37 myAdvice.before(); 38 method.invoke(person, args); 39 myAdvice.after(); 40 return proxy; 41 } 42 }); 43 } 44 45 }
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 }
标签:object string 第一个 ati 实例 类加载器 sys upd final
原文地址:https://www.cnblogs.com/xiaostudy/p/9535015.html