JAVA 动态代理
来源:互联网 发布:法丽达官网 只有淘宝店 编辑:程序博客网 时间:2024/06/06 20:27
JAVA 动态代理
采用静态代理的话,每一个方法指定要代理的方法都需要自己再写一遍,当方法过多的时候就很不方便,于是采用动态代理,动态代理,不具体指定某一个需要代理的方法,利用了JAVA反射机制,只管调用方法,会自动代理。
1.抽象角色
接口,列出需要被代理的方法
interface Subject{ void request(); void Show(String name);}
2.真实角色
实现真实操作的类,实现接口
class RealSubject implements Subject{ RealSubject(){}; public void request(){ System.out.println("From the Real Subject"); } public void Show(String name){ System.out.println(name); }}
3.动态代理角色
在真实操作的前后,附加一些操作。动态代理需要实现InvocationHandler接口
class ProxySubject implements InvocationHandler { private RealSubject realSubject;//真实对象去执行真实的操作 ProxySubject(){}; ProxySubject(RealSubject realSubject){ this.realSubject=realSubject; } //就算是同名,也不会调用这个函数 public void request(){ System.out.println("就算是同名,也不会调用这个函数"); } public void preRequest(){//在对真实对象操作之前,代理附加的操作 System.out.println("Pre Request"); } public void postRequest(){//在对真实对象操作完成之后,代理附加的操作 System.out.println("Post Request"); } //实现接口,利用反射机制,实现动态代理,会自动执行这个函数 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理类自动代理"); //打印出对象,及需要调用的方法和参数 System.out.println("Subject:"+realSubject); System.out.println("Method:"+method); System.out.println("args:"+args); preRequest(); method.invoke(realSubject,args);//调用真实角色及其方法 postRequest(); return null; }}
4.测试
主要实例化一个动态代理实例,然后通过实例调用方法。弄清楚构造参数。
public class JavaTest { public static void main(String arg[]){ RealSubject realSubject=new RealSubject();//真实被代理的对象 InvocationHandler ds = new ProxySubject(realSubject);//创建调用处理器 Class cls=realSubject.getClass();//创建要被代理的 类 //参数说明,需要类的类加载器,类的接口,一个调用处理器 Subject subject=(Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);//创建一个动态代理类的实例,只支持接口代理 subject.request();//通过代理实例调用方法 subject.Show("Call Show()"); }}
运行结果
代理类自动代理Subject:RealSubject@5e2de80cMethod:public abstract void Subject.request()args:nullPre RequestFrom the Real SubjectPost Request代理类自动代理Subject:RealSubject@5e2de80cMethod:public abstract void Subject.Show(java.lang.String)args:[Ljava.lang.Object;@1d44bcfaPre RequestCall Show()Post Request
完
0 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- 【cordova】cordova热更新插件的问题(cordova-hot-code-push)
- RabbitMQ
- jQuery Ajax 操作函数
- 压缩图片
- php中连接MySQL数据库
- JAVA 动态代理
- 2017全球大数据峰会|微软(中国)首席技术官韦青确认出席
- [HNOI2016] 最小公倍数
- AIX6.1 Oracle 11.0.2.4配置ST_Geometry
- spring注解方式实现定时任务@Scheduled
- jQuery 遍历函数
- 推荐一些计算机视觉相关的书籍
- Mysql从UNION ALL查询结果集中查询对应列出现错误"Every derived table must have its own alias"
- VerticalSeekBar 竖直滑动条