博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理
阅读量:6647 次
发布时间:2019-06-25

本文共 1883 字,大约阅读时间需要 6 分钟。

hot3.png

为什么会有动态代理呢?

在静态代理模式时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;

1.抽象类或者接口

public interface ISubject {   public void sayHello();}

2. 真实类(必须实现接口)

public class RealObject implements ISubject {  public void sayHello() {  System.out.println("hello glad to see you"); }}

3.动态创建代理对象的类(此时不能出现代理对象)

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler{//拿到对真实对象的引用(因为真实对象可能有很多个,因此我们必须定义成Object类型去任意匹配)//此时实现的是对任意真实兑现给的引用。此处也是固定的写法  private Object targetObject = null;   //方法--> 用来动态的生成代理对象(通过反射在运行期分析类的能力,然后动态生成)//注意只要是在运行期分析类的能力,都回去涉及到反射方法。  /***  * 1, 通过反射进入类的加载器  * 2,和真实对象实现相同的接口  * 3,一个对象,这个对象实现了InvocationHandler这个接口的对象的引用  *///这个方法也是固定的写法 public Object createDynamicProxyObjectMethod(Object targetObject){  this.targetObject = targetObject;//因为是要真实对象的代理,所以这块必须引入真实对象  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), //这个参数是得到类的加载器           targetObject.getClass().getInterfaces(),            this); //此处的this急救等于 new DynaProxyObject() }  //被系统自动调用的:只有这个方法时需要自己写的方法  public Object invoke(Object proxy, Method method, Object[] args)//注意此处的method不能是数组,若有n多接口或方法时只能是用if去判断及if(method 。equals(""));//参数args表示方法的参数,参数可以位任意的类型,因此用Object[]去匹配   throws Throwable {    Object resultObj = null;    this.before();    try {       resultObj = method.invoke(targetObject, args);  } catch (Exception e) {   e.printStackTrace();  }    this.after();    return resultObj; } public void before(){  System.out.println("before---------------"); }  public void after(){  System.out.println("after---------------"); } }

 4。客户端测试

public class Client {  public static void main(String[] args) {  DynaProxyObject dpo = new DynaProxyObject();  ISubject isub = (ISubject)dpo.createDynamicProxyObject(new RealObject());  isub.sayHello(); }}

  

转载于:https://my.oschina.net/ydsakyclguozi/blog/382368

你可能感兴趣的文章
Java消息服务
查看>>
Grid列拖拽、列选择、显示行号
查看>>
自定义的allocator
查看>>
浅谈CSRF漏洞
查看>>
JS----基本数据类型
查看>>
明天考前突击
查看>>
Android中的Handler的机制与用法详解
查看>>
【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
查看>>
「小程序JAVA实战」运行微信官方demo(四)
查看>>
jqGrid基本用法与示例
查看>>
spring @Bean注解的使用
查看>>
Vmware Workstation及Centos6.8 的安装
查看>>
发生未知错误17,解决办法
查看>>
EL与OGNL区别
查看>>
第7章课后总结
查看>>
Python os模块,常用函数和类
查看>>
C#窗体加载和控件加载不同步导致控件闪烁
查看>>
js 2
查看>>
PHP支付宝手机网站支付功能
查看>>
Lambda 表达式
查看>>