您的位置:首页 > 编程语言 > Java开发

Java 动态代理 Proxy

2011-01-12 11:05 323 查看
spring的AOP的感念是个深奥而又浅显的功能,说他深奥是因为他把一切都封装很好。方便了我们做程序的人员的应用。我们大家就可以不用思想直接使用了。说他浅显是因为他就是java的Proxy的一个实现。以前,我只是知道这么一个概念,想我这样的一个非计算机专业的毕业,学习了4年教育学的人并且吃软件开发这碗的人来说,不干尝试。后来一想既然已经做了这个行业,那就好好做下去。相信明天会更好。好了废话不说完开始正题!

下面我们来写一个自己的ArrayList名字就叫MyArrayList,他的实现和ArrayList是一样的,代码如下
package com.csdn.exam.third;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings({ "unchecked", "serial" })
public class MyArrayList extends ArrayList implements List{
/*
* 自己定义的MyArrayList 实现了List接口 同时 和ArrayList方法完全一致
*/
}


创造这类,就是让我以后生成这个类的代理类。java的代理Proxy必须是实现过接口的类。这是一个基本上可以说是一个硬性的规定。然后我们要创建一个类,我们实现这个proxy就是让我们在我们自己创建的类执行其各种方法时,通过代理类计算出方法的执行时间。

package com.csdn.exam.third;

public interface ArrayListProxy {
void beWork();
void enWork();
}


package com.csdn.exam.third;
/*
* 定义一个代理方法执行类
*/
public class ArrayListProxyImpl implements ArrayListProxy {
private long beTime;
/**
* 方法执行前 执行的方法
*/
public void beWork() {
// TODO Auto-generated method stub
this.beTime=System.currentTimeMillis();
}
/**
* 方法执行后 执行的方法
*/
public void enWork() {
// TODO Auto-generated method stub
System.out.println(System.currentTimeMillis() - this.beTime);
}

}


第一个的接口本来是不是必须的,但为了我们的程序更加的面向接口,和保持一个良好的java编程习惯我们还是定义了一个接口,然后我们来实现这个接口。下面呢的是ListProxy类的实现

package com.csdn.exam.third;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理类 产生代理ArrayList
* @author tianzhw
*
*/
public class ListProxy {
@SuppressWarnings("unchecked")
public Object proxy(final Object trage,final ArrayListProxy arrayListProxy)
{
return Proxy.newProxyInstance(trage.getClass().getClassLoader(), trage.getClass().getInterfaces(), new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
arrayListProxy.beWork();
Object obj=method.invoke(trage, args);
System.out.print("执行"+method.getName()+"方法,用时");
arrayListProxy.enWork();
return obj;
}
});
}
}


通过这个类,我们可以返回一个代理类。最后是一个测试类

package com.csdn.exam.third;

import java.util.List;

public class test {

/**
* 测试类
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
// TODO Auto-generated method stub
ListProxy proxy = new ListProxy();// 创建代理类对象
List list = (List) proxy.proxy(new MyArrayList(),
new ArrayListProxyImpl());// 通过代理类 创建MyArrayList对象的代理
list.add("123");
list.size();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: