1.InvocationHandler接口
里面有三个类:InvocationHandler,Method,proxy
InvocationHandler接口(调用处理器),就一个方法,invoke(),表示代理对象要执行的功能代码
代理类完成的功能:
1.调用目标方法,执行目标方法的功能
2.功能增强,在目标方法调用时,增加功能
方法原型:
public Object invoke(Object proxy, Method method, Object[] args)
参数:
Object proxy:jdk创建的代理对象,无需赋值
Method method:目标类中的方法,jdk提供的method对象
Object[] args:目标类中方法的参数,jdk提供
InvocationHandler接口:表示你的代理要干什么
用法:
1.创建类实现接口InvocationHandler
2.重写invoke()方法,把原来静态代理中代理类需要完成的功能,写在这里;
2.Method类:表示方法的,目标类中的方法
作用:
通过Method可以执行某个目标类的方法,Method.invoke();
method.invoke(目标对象,方法的参数)
method.invoke(demo,"李四");
method.invoke()就是用来执行目标方法的,等同于静态代理中的
//向厂家发送订单,告诉厂家,我买了U盘,厂家发货
float price = factory.sell(amount);
3.Proxy类:核心对象,创建代理对象。
方法:静态方法,newProxyInstance(),作用是创建代理对象,等同于在静态代理中创建TaoBao tao = new TaoBao();
方法原型:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
参数:
1.ClassLoader loader:类加载器,负责向内存中加载对象
例子:类a,a.getclass().getClassLoader(),目标对象的类加载器
2.Class<?>[] interfaces:接口,目标对象实现的接口,也是反射获取的
3.InvocationHandler h:自己写的,代理类要完成的功能
返回值:就是代理对象
4.实现动态代理的步骤
1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
1.调用目标方法
2.功能增强
4.使用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型