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动态代理的实现,等日后整理在记录下来。
阅读全文
0 0
- Java代理模式简单整理
- 简单代理模式 JAVA
- java 代理模式简单示例
- java代理模式简单介绍
- java代理模式简单实现
- 代理模式整理
- java动态代理设计模式简单示例
- java Proxy代理模式简单讲解
- 这样理解java代理模式更简单!!
- java 简单的代理设计模式
- 代理模式_笔记整理
- 代理模式 简单理解
- java设计模式---静态代理(简单笔记)
- java设计模式---动态代理(简单笔记)
- java的简单代理设计模式样例
- Java代理之代理模式
- java代理模式---静态代理
- java代理模式--动态代理
- 带你领略Linux系统发展及版本更迭
- JavaScript循环刷新页面
- 【bzoj3132】上帝造题的七分钟
- C++实现RSA加密解密
- css属性总结(一)
- Java代理模式简单整理
- Homing 使用初始值
- 新兴机器学习算法:从无监督降维到监督降维
- Android 优秀的第三方UI库集锦
- 对面向对象设计的理解—Java接口和Java抽象类
- c++ web framework
- 诤言只能对诤友《基层风云·1》·一
- Hibernate4中使用getCurrentSession报Could not obtain transaction-synchronized Session for current thread
- leetcode-624. Maximum Distance in Arrays