动态代理---JDK

一、原理简述

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 ---生成的代理对象,它的类型需要强转为统一接口中的某一个(因为目标对象可能实现了多个接口)

基于接口动态代理是Java语言提供的一个强大的特性,它允许我们在运行时创建新的代理对象,这个代理对象实现了我们指定的一系列接口,并且可以拦截并修改接口方法的执行过程。这一功能主要通过`java.lang.reflect.Proxy`和`InvocationHandler`接口实现。 以下是基本步骤: 1. **定义接口**:首先,你需要确定要代理的接口,这个接口将作为代理对象的行为规范。 ```java public interface MyInterface { void doSomething(); } ``` 2. **创建InvocationHandler**:这是核心部分,它包含了对实际方法的处理逻辑。当接口方法被调用时,会先传递给InvocationHandler,然后你可以在这里添加自定义行为。 ```java InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method call"); Object result = method.invoke(target, args); System.out.println("After method call"); return result; } }; ``` 3. **创建代理对象**:使用`Proxy.newProxyInstance()`方法,传入接口、InvocationHandler实例以及目标对象(如果有的话),返回一个新的代理对象。 ```java MyInterface target = ...; // 实现MyInterface的对象 MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class[]{MyInterface.class}, handler ); ``` 4. **使用代理对象**:现在你可以像使用普通接口一样,调用代理对象的方法了,实际上会触发InvocationHandler的`invoke`方法。 ```java proxy.doSomething(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值