动态代理--简单实现
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);
}
}
到此,一个简单的动态代理实例就完成了,希望对你有所帮助。嗯 还有如果想看注解和泛型的话,下次一并奉上。 也不早了,睡先 做个好梦。呵呵
废话少说,直接进入正题。
有关动态代理的定义之类的东西就不在此赘述了,网上一搜一大片。那么有人就说了,网上关于动态代理的简单实现也是一大片一大片的,干吗还在此废话?嗯 ,说的有理。是很多,但个人认为讲的系统点的,简单点,易理解的不很多,所以在此尝试写下。如果你是一个老鸟,当然会对些不屑一顾。个人认为:如果你是一个菜鸟(或者可以说对动态代理不很懂),那么请你不防看下本文或许会对你有所帮助。下边看代码:
首先大体说下本文的目的:比较 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);
}
}
到此,一个简单的动态代理实例就完成了,希望对你有所帮助。嗯 还有如果想看注解和泛型的话,下次一并奉上。 也不早了,睡先 做个好梦。呵呵
相关文章推荐
- 使用动态代理实现一个简单web客户端
- PHP实现依赖注入-使用反射机制和动态代理技术 - 简单思想(咋个办呢 zgbn)
- 动态代理的简单实现
- Jdk动态代理简单实现
- 使用动态代理实现简单AOP
- 动态代理的简单实现
- 动态代理简单实现
- Java动态代理实现(简单AOP实现)
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- Java动态代理简单实现
- 复习笔记:一个简单的动态代理实现
- 动态代理的实现1-简单实现
- aop学习总结一------使用jdk动态代理简单实现aop功能
- Java动态代理之JDK实现和CGlib实现(简单易懂)
- Java反射之JDK动态代理实现简单AOP
- 动态代理简单实现-1
- ava中代理,静态代理,动态代理实现原理简单易懂
- JDK动态代理实现简单AOP--转
- 动态代理实现规则的简单降级
- aop学习总结二------使用cglib动态代理简单实现aop功能