[原创]java中的动态代理的使用_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3836 | 回复: 0   主题: [原创]java中的动态代理的使用        下一篇 
鲲鹏展翅
注册用户
等级:少校
经验:1148
发帖:79
精华:9
注册:2012-11-19
状态:离线
发送短消息息给鲲鹏展翅 加好友    发送短消息息给鲲鹏展翅 发消息
发表于: IP:您无权察看 2012-11-23 9:00:51 | [全部帖] [楼主帖] 楼主

1.动态代理的原理 :

     (1).在运行时通过一个类的字节码对象-反射,操作原对象。

     (2).动态代理就是通过反射来实现的。

     (3).被代理的类,必须应该具有一个接口。

     (4).动态代理通过两个类来实现:

     a:Proxy- 生成代理类的工具类。

     b:InvocationHandler- 拦截代理类的句柄。

2.动态代理的好处 :动态代理可以在不修改污染原类的情况下,修改目标类的执行。

3.动态代理的实例代码

package cn.itcast.utils;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
public class ConnUtils {
      //使用LinedList加快存取速度
      private static LinkedList<Connection> pool = new LinkedList<Connection>();
      static{
            try{
                  Class.forName("com.mysql.jdbc.Driver");
                  String url = "jdbc:mysql:///itcast?characterEncoidng=UTF8";
                  for(int i=0;i<3;i++){
                        final Connection con = DriverManager.getConnection(url,"root","1234");
                        Object proxedObj =
                        Proxy.newProxyInstance(
                        ConnUtils.class.getClassLoader(),
                  new Class[]{Connection.class},
                        new InvocationHandler() {
                              public Object invoke(Object proxy, Method method, Object[] args)
                              throws Throwable {
                                    //判断是否调用的是closre方法
                                    if(method.getName().equals("close")){
                                          System.err.println("有人还连接...");
                                          synchronized (pool) {
                                                pool.addLast((Connection) proxy);
                                                pool.notify();
                                          }
                                          return null;
                                    }
                                    return method.invoke(con, args);
                              }
                        });
                        //将代理放到池中
                        pool.add((Connection) proxedObj);
                  }
            }catch(Exception e){
            e.printStackTrace();
      }
}
public static Connection getCon(){
      synchronized (pool) {
            if(pool.size()==0){
                  try {
                        pool.wait();
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                  return getCon();
            }else{
            return pool.removeFirst();
      }
}
}
}


该贴被鲲鹏展翅编辑于2012-11-23 9:04:28




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论