Java代理模式
来源:互联网 发布:华西附二院抢号软件 编辑:程序博客网 时间:2024/06/05 02:14
本文将从以下几个方面进行阐述:
静态代理:
其类图如下:
真实角色与代理类同时实现一个接口,真实角色只处理与它核心业务相关的,其他的全部由代理角色完成。
/** * 抽象接口 * @author sg */public interface Subject { void printBeforeLogging(); void operation(); void printAfterLogging();}
//真实角色public class RelSubject implements Subject{ @Override public void printBeforeLogging() { System.out.println("RelSubject printBeforeLogging"); } @Override public void operation() { System.out.println("RelSubject operation"); } @Override public void printAfterLogging() { System.out.println("RelSubject printAfterLogging"); }}
//代理角色public class Proxy implements Subject{ private Subject subject; public Proxy(Subject subject) { super(); this.subject = subject; } @Override public void printBeforeLogging() { System.out.println("Proxy printBeforeLogging"); } @Override public void operation() { //真实的角色来完成 subject.operation(); } @Override public void printAfterLogging() { System.out.println("Proxy printAfterLogging"); }}
//客户端代码public class Client { public static void main(String[] args) { Subject subject=new RelSubject(); Subject proxy=new Proxy(subject); proxy.printBeforeLogging(); proxy.operation(); proxy.printAfterLogging(); }}
Proxy printBeforeLogging
RelSubject operation
Proxy printAfterLogging
动态代理
public interface Calculate { void operate();}
public class CalculateImpl implements Calculate{ @Override public void operate() { System.out.println("Operating"); }}
//代理类import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler{ //目标对象 private Object target; public DynamicProxy(Object target){ this.target= target; } public Object getProxy(){ //调用Proxy的静态方法 return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target, args); return result; }}
//客户端public class Client { public static void main(String[] args) { Calculate target=new CalculateImpl(); Calculate proxy = (Calculate)new DynamicProxy(target).getProxy(); proxy.operate(); }}
cglib代理实现
首先下载所必须Jar包:cglib
public class CglibProxyFactory implements MethodInterceptor { private Object target; public CglibProxyFactory(Object target) { super(); this.target = target; } public Object myCglibLogging() { Enhancer enhancer = new Enhancer(); // 生成得代理类对象为该类的子类 enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return enhancer.create(); } /** * 调用动态方法的时候会调用此方法 */ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { Object result = method.invoke(target, args); System.out.println(method); return result; }}
//测试public class CglibProxyTest { public static void main(String[] args) { CglibProxyTest ct=new CglibProxyTest(); CglibProxyTest myCglibLogging = (CglibProxyTest) new CglibProxyFactory(ct).myCglibLogging(); myCglibLogging.run(); } public void run(){ System.out.println("running"); }}
总结:
基于接口的代理方式的缺点为所要代理的应该实现接口,而基于cglib的代理如果定义为final也是无法实现的了。
阅读全文
0 0
- Java代理之代理模式
- java代理模式---静态代理
- java代理模式--动态代理
- 代理模式&java动态代理
- JAVA代理模式--静态代理
- JAVA代理模式--动态代理
- JAVA动态代理 代理模式
- Java代理模式-静态代理
- java代理模式-动态代理
- Java代理模式 静态代理 动态代理
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- JAVA代理模式与动态代理模式
- Java代理模式和kotlin代理模式
- Java中的代理模式
- linux系统命令总结(一)
- C++设计模式——原型模式
- GC的四种清理算法
- java中if与switch-case语句的使用及一些注意事项
- Java内存模型
- Java代理模式
- 设计模式——命令模式
- 素数判断 Miller_Rabin算法-hoj1356和51nod1186质数检测V2
- EmbCaffe---基于Caffe的优化前向计算的框架
- 演讲实录|唐刘:Rust in TiKV
- Android-系统启动过程
- zabbix触发器表达式详解
- Ta-lib学习笔记01--成交量指标
- 并行定律