java 动态代理

1、定义接口

1 package cc.whoisit;
2 
3 public interface ISpeak {
4     public void speak();
5 }

2、实现接口

 1 package cc.whoisit;
 2 
 3 public class EnglishSpeak implements ISpeak{
 4 
 5     @Override
 6     public void speak() {
 7         // TODO Auto-generated method stub
 8         System.out.println("I speak English.");
 9     }
10 }

3、编写Handler

 1 package cc.whoisit;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 public class SpeakHandler implements InvocationHandler {
 7     private Object obj;
 8 
 9     public SpeakHandler(Object obj){
10         super();
11         this.obj=obj;
12     }
13     
14     @Override
15     public Object invoke(Object proxy, Method method, Object[] args)
16             throws Throwable {
17         // TODO Auto-generated method stub
18         this.before();
19         Object result = method.invoke(this.obj, args);
20         this.after();
21         return result;
22     }
23     
24     private void before() {
25         System.out.println("before.");
26     }
27     
28     private void after() {
29         System.out.println("after.");
30     }
31 }

这个handler是我们控制被代理对象行为的地方。

4、代理工厂

 1 package cc.whoisit;
 2 
 3 import java.lang.reflect.Proxy;
 4 
 5 public class ProxyFactory {
 6     public static <T> T newInstance (T obj) {
 7         SpeakHandler handler = new SpeakHandler(obj);
 8         T proxy = (T)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
 9         return proxy;
10     }
11 }

 

 5、测试

 1 package cc.whoisit;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         ISpeak proxy = ProxyFactory.newInstance(new EnglishSpeak());
 8         proxy.speak();
 9     }
10 }

 

写这个动态代理的目的是为了写数据库连接自动关闭做准备的。数据库连接自动关闭,其实就是在hanlder中的after中调用数据连接的close()方法。这样被代理对象只管关心对数据库做CURD操作,不必关心数据库连接的关闭了。

posted @ 2015-02-26 23:27  ccppe  阅读(173)  评论(0编辑  收藏  举报