Java代理模式简单整理

来源:互联网 发布:2017软件测评师真题 编辑:程序博客网 时间:2024/05/16 17:24

之前学习Java的代理模式,深深的感叹这种模式是多么的美好!简单的整理一下,方便以后查看。

定义:为其他对象提供一种代理以控制这个对象的访问。(例如火车票代理点)

分类:

远程代理
虚拟代理
保护代理
智能引用代理

智能引用代理

静态代理
代理和被代理对象在代理之前是确定的。他们都实现相同的接口或者继承相同的抽象类

两种实现方式:继承(不推荐)和聚合
动态代理

jdk动态代理

1.只能代理实现了接口的类
2.没有实现接口的类不能实现jdk的动态代理。

CGLIB动态代理

1.针对类来实现代理的
2.对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用

jdk动态代理

关键:ProxyHandler 事务处理器

实现步骤:

1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理类以及接口
3.调用Proxy的静态方法,创建一个代理类
newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
4.通过代理调用方法

示例代码:(模拟时间记录与日志记录动态代理,简单明了)

package com.jdkproxy;/** * 被代理类实现的接口 * @author Administrator */public interface Moveable {public void move();}
package com.jdkproxy;import java.util.Random;/** * 被代理类 * @author Administrator */public class Car implements Moveable {@Overridepublic void move() {// 实现开车try {Thread.sleep(new Random().nextInt(1000));System.out.println("汽车行驶中。。。");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

package com.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 模式实现Log日志记录代理类 * @author Administrator */public class LogProxy implements InvocationHandler {private Object target;public LogProxy(Object target) {super();this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("日志记录开始");method.invoke(target);System.out.println("日志记录结束");return null;}}
package com.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 模式实现Time记录代理类 * @author Administrator * */public class TimeHandler implements InvocationHandler {private Object target;public TimeHandler(Object target) {super();this.target = target;}/** * 参数: * proxy:被代理对象 * method:被代理对象的方法 * args:方法的参数 *  * 返回值 * Object 方法的返回值 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {long starttime = System.currentTimeMillis();System.out.println("汽车开始行驶。。。");method.invoke(target);long endtime = System.currentTimeMillis();System.out.println("汽车结束行驶。。汽车行驶时间" + (endtime - starttime) + "毫秒");return null;}}
package com.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import com.proxy.Car;import com.proxy.Moveable;/** * jdk动态代理测试类 * @author Administrator * */public class Test {public static void main(String[] args) {Car car = new Car();InvocationHandler h = new TimeHandler(car);Class<?> cls = car.getClass();/** * loader 类加载器 * interfaces 实现接口 * h InvocationHandler *///添加Time代理Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h);//添加Log代理InvocationHandler h1 = new LogProxy(m);Moveable m2 = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h1);m2.move();}}
CGLIB动态代理

对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用。

代码示例:

package com.cglib;public class Train {public void move(){System.out.println("火车行驶中。。。");}}
package com.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();public Object getProxy(Class clazz){//设置创建子类的类(为哪个类产生代理类)enhancer.setSuperclass(clazz);enhancer.setCallback(this);return enhancer.create();}/** * 拦截所有目标类方法的调用 * 参数: * obj 目标类的实例 * m 目标方法的反射对象 * args 方法的参数 * proxy 代理类的实例 */@Overridepublic Object intercept(Object obj, Method m, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("日志开始");//代理类调用父类的方法proxy.invokeSuper(obj, args);System.out.println("日志结束");return null;}}
package com.cglib;public class Client {public static void main(String[] args) {CglibProxy proxy = new CglibProxy();Train t = (Train) proxy.getProxy(Train.class);t.move();}}
 模拟JDK动态代理的实现,等日后整理在记录下来。