1.1 简述及实现原则:
在不改变源代码的前提下,在源代码的执行中,动态的将原方法进行增强
依赖反射
动态代理中:
待增强的方法称为被代理的对象
增强功能的对象叫做代理对象
举例:
买衣服
以前买衣服必须去服装店购买。
现在通过网店对服装店进行了增强,可以不出门就买上衣服
服装店就是被代理的对象
网店就是代理对象
代理:代为处理
实现原则:
1、获取代理对象
2、通过Proxy.newInstance方法创建代理对象
3、代理对象获取被代理对象所有的接口,用于代理
4、实现InvocationHandler接口,进行功能增强
1.2 案例实现:
代码解释写在了Test类中
Phone接口:
public interface Phone { void conversation(String number); void call(); }
HWPhone实现类:
public class HWPhone implements Phone { public void conversation(String number) { System.out.println("电话号:"+number); } public void call() { System.out.println("打电话"); } }
Test类:
public class Test { public static void main(String[] args) { //需求:只对call方法进行增强 //1. 获取被代理对象 final HWPhone hwPhone = new HWPhone(); //2. 根据被代理对象,创建代理对象 //参数一:获取当前类的类加载器 //参数二:获取被代理对象的所有接口 //参数三:实现InvocationHandler接口,对功能进行增强 Proxy.newProxyInstance( Test.class.getClassLoader(), hwPhone.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //2.1 判断是否需要增强 call if (method.getName().equals("call")) { //2.1.1 调用之前方法功能 //参数一:被代理对象,必须为final类型 //参数二:该方法的参数,无参数args为null method.invoke(hwPhone, args); //2.1.2 对该功能进行增强 System.out.println("我是" + method.getName() + "方法,我被增强了~~~"); //该方法无返回值,返回null即可 return null; } //2.2 不是需要增强的方法,调用之前的即可 return method.invoke(hwPhone, args); } }); //必须使用代理对象调用方法才会被增强 hwPhone.call(); hwPhone.conversation("54188741741"); } }
未增强展示信息:
增强后展示信息:
使用场景:
小结:
1、获取代理对象
2、根据代理对象,创建被代理对象
3、代理对象调用增强方法
注意:每次调用方法都是调用的invoke方法。
作者:xihe
地址:https://www.cnblogs.com/xihelog/
原文:https://www.cnblogs.com/xihelog/p/11285442.html