定义:为其他对象提供一种代理以控制对这个对象的访问。代理对象起到中介的作用,可去掉功能服务或增加额外的服务。
推荐用聚合方式实现静态代理
所谓动态代理是这样一种class:它是在运行时生成的class,该class需要实现一组interface,使用动态代理时必须实现InvocationHandler接口。
动态代理的实现步骤:1、创建一个实现接口InvocationHandler的类,他必须实现invoke方法(即先写事物处理器,在invoke方法里边添加具体业务逻辑)。2、创建被代理的类以及接口。3、调用Proxy的静态方法,创建一个代理类newProxyInstance(ClassLoader loader,Class[] interface,InvocationHandler h); 4、通过代理调用方法。
例如:
package com.imooc.jdbcproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class TimeHandler implements InvocationHandler { public TimeHandler(Object target) { super(); this.target=target; } private Object target;/* * 参数:proxy是被代理的对象 * method:被代理的方法 * arg:方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始开车时间——————"); long starttime=System.currentTimeMillis(); method.invoke(target); System.out.println("开车结束时间-------"); long endtime=System.currentTimeMillis(); System.out.println("开车所用时间。。。。。"+(endtime-starttime)+"毫秒"); return null; }}package com.imooc.jdbcproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import com.imooc.proxy.Car;import com.imooc.proxy.moveAble;/* * JDK动态代理测试类类 */public class Test { public static void main(String[] args) { Car car=new Car(); InvocationHandler h=new TimeHandler(car); Class<?> cls=car.getClass(); /* * loader;类加载器 * interface:实现接口 * h InvocationHandler: */ moveAble m=(moveAble) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h);//动态产生了代理对象 m.move(); }}动态代理的实现思路:
实现功能:通过Proxy的newProxyInstance返回代理对象
1、声明一段源码(动态产生代理),2、编译源码(JDK Compiler API),产生新的类(即代理类)。3、将这个类load到内存中,产生一个新的对象(即代理对象)。4、return 代理对象。