您的位置:首页 > 其它

动态代理--简单实现

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

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

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

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

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