Java中的动态代理

 @SuppressWarnings("rawtypes")
 private static Object getProxy(final Object target)
 {
  Object collProxy = (Object) Proxy.newProxyInstance(target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), new InvocationHandler()
    {
     @Override
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
     {
      long beginTime = System.currentTimeMillis(); ------------可以提取到一个接口中,这样就可更面向方面编程了。这样直接传一个对象参数
      Object retValue = method.invoke(target, args);
      long endTime = System.currentTimeMillis();--------------------------可以提取到一个接口中,这样就可更面向方面编程了。这样直接传一个对象参数
      System.out.println("运行时间:" + (endTime - beginTime)); ------------可以提取到一个接口中,这样就可更面向方面编程了。这样直接传一个对象参数
      return retValue;
     }
    });
  return collProxy;
 }

 

// 别一种方式写动态代理类
  System.out.println("--------------------------------------------------------------");
  final ArrayList target = new ArrayList();
  Collection collProxy = (Collection)getProxy(target);
  collProxy.add("aaa");
  collProxy.add("bbb");
  collProxy.add("ccc");
  System.out.println(collProxy.size());

 

AOP

l系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示:

                              安全       事务         日志

StudentService  ------|----------|------------|-------------

CourseService   ------|----------|------------|-------------

MiscService       ------|----------|------------|-------------

l用具体的程序代码描述交叉业务:

method1         method2          method3

{                      {                       {

------------------------------------------------------切面

....            ....              ......

------------------------------------------------------切面

}                       }                       }

l交叉业务的编程问题即为面向方面的编程(Aspect oriented program ,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,如下所示:

------------------------------------------------------切面

func1         func2            func3

{             {                {

....            ....              ......

}             }                }

------------------------------------------------------切面

l使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。

 

 

代理内部原理

l动态生成的类实现了Collection接口(可以实现若干接口),生成的类有Collection接口中的所有方法和一个如下接受InvocationHandler参数的构造方法。
l构造方法接受一个InvocationHandler对象,接受对象了要干什么用呢?该方法内部的代码会是怎样的呢?
l实现Collection接口的动态类中的各个方法的代码又是怎样的呢?InvocationHandler接口中定义的invoke方法接受的三个参数又是什么意思?图解说明如下:

 

posted on 2013-05-06 22:05  peter.peng  阅读(157)  评论(0)    收藏  举报