欢迎进入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]
逆境磨练人、逆境是老师、逆境之苦可变甜。