javaSE之动态代理

动态代理技术:

    使程序更加灵活,可以在代理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;
     }
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值