动态代理--简单实现
来源:互联网 发布:坐标变换 知乎 编辑:程序博客网 时间: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);
}
}
到此,一个简单的动态代理实例就完成了,希望对你有所帮助。嗯 还有如果想看注解和泛型的话,下次一并奉上。 也不早了,睡先 做个好梦。呵呵
- 动态代理--简单实现
- 动态代理--简单实现
- 动态代理简单实现
- 实现简单的动态代理!
- 实现简单的动态代理!
- Java动态代理简单实现
- 动态代理的简单实现
- 动态代理简单实现-1
- 动态代理的简单实现
- 实现简单的动态代理
- Jdk动态代理简单实现
- 动态代理的实现1-简单实现
- 动态代理的实现1-简单实现
- 动态代理的实现1-简单实现
- 使用动态代理实现简单AOP
- java动态代理的简单实现:
- 用javassist实现简单的动态代理
- 简单的 JDK实现动态代理
- Java接口有关题目2(初学者的Help)
- zz
- 全局设局
- JAVA方向学习扩展建议
- 该往哪个方向,迷茫啊!
- 动态代理--简单实现
- 12.23
- verilog语法学习心得
- C++-C编程指南 学习笔记
- 显示系统时间
- Java异常基础
- Dos 下 int 21h 软中断
- 简单的学生统计程序
- ie和火狐浏览器都支持的回车键提交表单登录