zoukankan      html  css  js  c++  java
  • SSM-Spring-09:Spring中jdk动态代理

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    JDK动态代理:

      为何叫JDK动态代理呢?

        所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api

        代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

        何为动态?相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

      下面我拿例子带入,具体的动态代理案例如下:

        首先按平时的方式来写,一个接口,一个实现它的类

          ISomeService接口

    package cn.dawn.day09jdkdtproxy;
    
    /**
     * Created by Dawn on 2018/3/8.
     */
    public interface ISomeService {
        public void doSome();
    }

          SomeServiceImpl类,实现ISomeService接口

    package cn.dawn.day09jdkdtproxy;
    
    /**
     * Created by Dawn on 2018/3/8.
     */
    public class SomeServiceImpl implements ISomeService {
        public void doSome() {
            System.out.println("do something");
        }
    }

          测试类,用动态代理的形式,对方法进行增强操作

    package cn.dawn.day09jdkdtproxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * Created by Dawn on 2018/3/8.
     */
    public class Test {
        public static void main(String[] args) {
            /*匿名内部类要想得到外面的值,需要把外面的值改为常量*/
            final ISomeService service=new SomeServiceImpl();
            /*用动态代理的方式生成ISomeService的对象,就是增强后的对象,可以看看newProxyInstance的方法参数,就有方法去写了*/
            /*InvocationHandler是由代理实例的调用处理程序实现的接口。*/
            ISomeService proxy=(ISomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
                /**
                 *invoke:每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分派给invoke 其调用处理程序的方法。
                 * @param proxy     代理对象,没啥用
                 * @param method        反射获取的方法
                 * @param args          方法的参数
                 * @return
                 * @throws Throwable
                 */
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("before===================");
                    method.invoke(service,args);//相当于执行目标类型的方法
                    return null;
                }
            });
            proxy.doSome();
        }
    }

          值得一提的是:Proxy是java.lang.reflect包下,正因如此,才叫JDK动态代理

  • 相关阅读:
    macbook466加了两条1333金士顿正常
    spring 使用 groovy 的 utf8 问题
    jQuery Pagination Plugin Demo
    ssh 二级跳 转
    实战 Groovy: 用 curry 过的闭包进行函数式编程
    无刷新分页 jquery.pagination.js 张龙豪 博客园
    用fgets()函数从屏幕上输入一字符串_BenRuanChinaUnix博客
    What Is My IP Shows Your IP Address
    Chapter 24. Dynamic language support
    什么是SQA?
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/8530766.html
Copyright © 2011-2022 走看看