Java静态代理和动态代理

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  * 参数:

  * proxy 就是代理类的对象

  * method 就是需要调用的实现接口中的方法

  * args 方法中的参数

  * 返回值 返回代理类调用实现接口的方法的返回值

  */

  @Override

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  //调用真实对象中的方法,获取返回值

  if(method.getName()。equals(”quote”)){

  String returnValue = (String) method.invoke(this.RealObject, args);

  returnValue = returnValue.replace(”2000″, “3000”);

  return returnValue;

  }

  //其他不需要代理类修改的方法

  return method.invoke(this.RealObject, args);

  }

  }

  其中Proxy.newProxyInstance方法返回一个代理对象,其中的第三个参数是实现InvocationHandler的接口,当调用代理对象的方法的时候,会调用InvocationHandler接口中的invoke方法用来对真实对象的方法增强,我们在invoke方法中只修改了获得房屋报价的内容。对获得房屋地址方法没有进行更改,直接调用真实对象的方法就行了。解释一下就是中介会把房屋的出租价格提高,但是房屋的地址不能修改吧,所以动态代理可以很好的控制需要增强的方法。

  看一下我们的测试类:

  public static void main(String[] args) {

  //找代理出租房屋

  RealSubjectHome subjecthome = new RealSubjectHome();

  DynamicProxy proxy = new DynamicProxy();

  Subject subject = (Subject) proxy.createSubject(subjecthome);

  //得到房屋的报价信息

  System.out.println(subject.quote());

  //得到房屋的地址

  System.out.println(subject.getHouseAddress());

  }

  使用动态代理编写代理类的时候,其实并不难,只要注意两点就行了:1,代理类持有真实类的引用 2,代理类和真实类实现同一个接口。然后要多proxy类的newProxyInstance的参数含义理解,对InvocationHandler中的invoke方法的参数理解,就可以了。

  动态代理的思想在框架中使用的很多,其实使用jdk提供的动态代理的实现并不是很多,都是使用三方的实现,例如CGLIB,直接对类的字节码文件进行增强。静态代理和动态代理的实现就先这样,如果叙述中有错误,请指明。

[1][2]

逆境磨练人、逆境是老师、逆境之苦可变甜。

Java静态代理和动态代理

相关文章:

你感兴趣的文章:

标签云: