您的位置:首页 > 其它

动态代理--简单实现

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

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

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

首先大体说下本文的目的:比较 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);

}

}

到此,一个简单的动态代理实例就完成了,希望对你有所帮助。嗯 还有如果想看注解和泛型的话,下次一并奉上。 也不早了,睡先 做个好梦。呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: