动态代理技术:
使程序更加灵活,可以在代理java类的时候加入一些功能。
很类似过滤器,区别:
过滤器是自己编写西横须实现的功能
动态代理是JVM内部机制
实现步骤:
1.真是业务对象(被代理对象)
2.代理对象
3.需要为被代理对象制定代理对象(建立关系)
隐含.代理对象需要提供和被代理对象一样的方法
依赖于Proxy类
java变成中代理对象是有Proxy动态生成的
Proxy类中newInstance方法是生成某个代理对象的
需要如下三个参数
1.类加载器(被代理对象的类加载器)
2.制定被代理对象的接口集合
3.InvoctionHandler代理的行为(代理对象的扩展)invoke 注 :返回值必须是接口
必须理解
1.一旦为java类指定代理对象,那么不管怎么操作java类,都必须先执行代理对象
2.由于invoke方法呗调用需要三个参数(代理对象,方法,方法参数 ),因此不管代理对象哪个方法调用
处理器的invoke方法,都必须把自己所在的对象(调用invoke方法的方法),方法的参数传递进来
注:java编程时,动态代理必须基于接口
代理对象(类)示例:
public class RequestProxy {
// 接收真实业务对象 返回代理对象
public static HttpServletRequest getProxy(final HttpServletRequest request) {
HttpServletRequest requestProxy = (HttpServletRequest) Proxy
.newProxyInstance(request.getClass().getClassLoader(), request
.getClass().getInterfaces(), new InvocationHandler() {
// 当执行 request.getParameter时 执行invoke
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// 加强getParameter
if (method.getName().equals("getParameter")) {
// 加强
String value = (String) method
.invoke(request, args);
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
if (httpServletRequest.getMethod()
.equalsIgnoreCase("post")) {
return value;
}
// 处理 get
if (value == null) {
return null;
}
// 手动get转码
value = new String(value.getBytes("ISO-8859-1"),
"utf-8");
return value;
}
// 其它方法不加强
return method.invoke(request, args);
}
});
return requestProxy;
}
}