jdk 动态代理是代理模式的一种实现方式,其只能代理接口。
实现步骤:
1、新建一个接口,作为目标接口。
2、为接口创建一个实现类,是目标类。
3、创建类实现 java.lang.reflect.InvocationHandler 接口,调用目标方法并增加其他功能代码。
4、创建动态代理对象,使用 Proxy.newProxyInstance() 方法,并把返回值强制转为接口类型。
idea 创建 java project
工程名称:ch02-dynamicproxy
(**1**) 定义目标接口
//接口public interface UsbSell {public abstract float sell(int amount);}
(**2**) 定义目标接口实现类
//接口实现类class UsbFactory implements UsbSell {@Overridepublic float sell(int amount) {System.out.println("工厂类执行啦!");return 70.0F;}}
(**3**) 定义调用处理程序
调用处理程序是实现了 InvocationHandler 的类,在 invoke 方法中增加业务功能。还需要创建有参构造,参数是目标对象。为的是完成对目标对象的方法调用。
class MySellHander implements InvocationHandler {//得到传入的对象private Object object = null;public MySellHander() {}//使用构造方法得到目标对象,赋值非 private Object object;public MySellHander(Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//执行目标方法.传入方法所在类的对象,与方法的参数,得到方法的返回值Object result = method.invoke(object, args);//通过 返回值 增强方法。(增加价格)if (result != null) {float price = (float) result;result = price + 25;}return result;}}
(4) 创建动态代理对象**
lass TestHander {public static void main(String[] args) {//创建代理对象UsbSell usbFactory = new UsbFactory();//创建调用处理器InvocationHandler mySellHander = new MySellHander(usbFactory);//创建jdk动态代理UsbSell usbSell = (UsbSell)Proxy.newProxyInstance(usbFactory.getClass().getClassLoader(),usbFactory.getClass().getInterfaces(),mySellHander);//通过代理对象执行业务float price = usbSell.sell(1);System.out.println(price);}}
