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操作,不必关心数据库连接的关闭了。
原文:http://www.cnblogs.com/Ehtan/p/4302389.html