一、原理简述
AOP的切面编程用到了JDK动态代理和Cglib动态代理,它们各有优劣,这里简单介绍下JDK动态代理的使用。JDK动态代理是java内部反射机制来实现的,它的应用前提是
目标类基于统一的接口。
二、使用简述
1)创建接口mobile
2)创建接口phone
3)创建mobile和phone接口的实现类
4)创建扩展功能接口
5)创建扩展功能实现类
6)InvocationHandler
7)测试1
8)结果1
9)测试2
10)结果2
三、总结
1)目标对象Iphone,实现了mobile和phone接口,在创建代理对象proxy的时候,我们可以将生成的对象任意强转为任意一个接口类型,转为那个,
就代理哪个接口的方法。
2)注意:目标对象必须实现接口;
3)加强的方法可以在原方法执行前、后或前后执行;
4)mobile.getClass().getInterfaces(),这句代码的意思就是获取目标对象实现的接口,然后创建实现了统一接口的代理对象,它的返回值是一个Class类型的数组;
5)代理对象创建完成后,调用的是代理对象的方法(因为实现了统一的接口所以目标对象的实现了接口的方法在代理对象中都有这些方法),这样就在代理对象中
实现了对目标对象方法功能的扩展。
6)标识符解释
Object proxy ---代理对象
Method method ---目标对象方法对象
Object[] args ---目标对象方法需要传的参数列表,可能是多个参数,因此这里的数据类型是数组
Object invoke = method.invoke(mobile, args); ---使用反射调用目标对象方法,mobile为目标对象,不可以是生成的代理对象,否则死循环
Phone proxy ---生成的代理对象,它的类型需要强转为统一接口中的某一个(因为目标对象可能实现了多个接口)