动态代理--简单实现

来源:互联网 发布:坐标变换 知乎 编辑:程序博客网 时间:2024/06/04 17:54

这是本人第一次写技术性的东西,也是第一次写博。请大家多多包含。如果觉得不好拍块砖(激励本人更加努力),如果觉得还对的起观众请鼓励下(一定会再接再厉) 呵呵

废话少说,直接进入正题。

有关动态代理的定义之类的东西就不在此赘述了,网上一搜一大片。那么有人就说了,网上关于动态代理的简单实现也是一大片一大片的,干吗还在此废话?嗯 ,说的有理。是很多,但个人认为讲的系统点的,简单点,易理解的不很多,所以在此尝试写下。如果你是一个老鸟,当然会对些不屑一顾。个人认为:如果你是一个菜鸟(或者可以说对动态代理不很懂),那么请你不防看下本文或许会对你有所帮助。下边看代码:

首先大体说下本文的目的:比较 List 集合的执行效率,在此就举两个例子(主要是说动态代理)

个人认为对于 jdk 的动态代理可以分为四步:

1.创建要被代理的接口及其实现类(因为 jdk 的动态代理是基于接口的)

package com.david.dynamicProxy;

import java.util.List;
/**
 * 计算速度的接口
 * @author David liu
 * @param <E>
 *        此处用到了泛型
 */
public interface SpeedOfList<E> {
 public void iteratorList(List<E> list);
}

package com.david.dynamicProxy;

import java.util.List;
/**
 * 第一个实现类
 * @author David liu
 */
public class SpeedOfOneList implements SpeedOfList<Long> {//此处是泛型

 @Override
 public void iteratorList(List<Long> list) {
  
  for (int i=0; i<list.size(); i++){
   System.out.println(list.get(i));
  }
 }

}

package com.david.dynamicProxy;

import java.util.List;
/**
 * 第二个实现类
 * @author David liu
 */
public class SpeedOfTwoList implements SpeedOfList<Long> {

 @Override
 public void iteratorList(List<Long> list) {
  
  for (Long l : list){
   System.out.println(l);
  }
 }

}

package com.david.dynamicProxy;

import java.util.ArrayList;
import java.util.List;
/**
 * 给 list 集合添加数据
 * @author David liu
 */
public class AddElementForList {
 
 public List<Long> addElementForList(){
  List<Long> list = new ArrayList<Long>();
  
  for (Long i=1L; i<10000001; i++){
   list.add(i);
  }
  return list;
 }
}

2.创建一个实现 invocationHandler 接口的类

package com.david.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 实现了 invocationHandler 接口,其中 invoke
 * 方法是必须实现的
 * @author David liu
 */
public class RealHandler implements InvocationHandler {
 //动态执行的对象
 private Object target;
 
 public RealHandler() {
 }
 
 public RealHandler(Object target) {
  this.target = target;
 }

 //该方法是被自动调用的
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  
  Long startTime = System.currentTimeMillis();//记录开始时间
  
  method.invoke(target, args);//执行方法
  
  Long endTime = System.currentTimeMillis();//记录结束时间
  
  System.out.println("共花费时间:" + (endTime - startTime));//计算时间差
  
  return null;
 }

 //下边的 getters and setters 其实是可以不写的
 public Object getTarget() {
  return target;
 }

 public void setTarget(Object target) {
  this.target = target;
 }
}

package com.dy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.List;
/**
 * 调用方法
 * @author David liu
 */
public class Main {
 public static void main(String[] args) {
  
  SpeedOfOneList so = new SpeedOfOneList();//第一个被代理的对象
  //SpeedOfTwoList so = new SpeedOfTwoList();//第二个被代理的对象
  InvocationHandler ih = new RealHandler(so);//上传 RealHandler 并将被代理的对象传进去
  Class<?> c = so.getClass();//得到被代理对象的 class
  
  @SuppressWarnings("unchecked")//注解(annotation)
  //3.生成 proxy 的静态方法
  //关于 Proxy.newProxyInstance 参数
  //1)被代理对象的类加载器(calssLoader)
  //2)得到被代理对象实现的所有接口(interface)
  //3)真正的操作 InvocationHandler
  SpeedOfList<Long> sl = (SpeedOfList<Long>)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), ih);
  
  List<Long> oneList = new AddElementForList().addElementForList();
  //4.通过代理调用方法
  sl.iteratorList(oneList);
 }
}

到此,一个简单的动态代理实例就完成了,希望对你有所帮助。嗯 还有如果想看注解和泛型的话,下次一并奉上。 也不早了,睡先 做个好梦。呵呵

原创粉丝点击