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操作,不必关心数据库连接的关闭了。

转载于:https://www.cnblogs.com/Ehtan/p/4302389.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值