首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 核心技术 >> 高级编程 >> 正文

CGLib实现变化字段探测的供能

3 )定义剖析用工具类。

import net.sf.cglib.proxy.Callback;

import net.sf.cglib.proxy.Factory;

 

public class JavaBeanInterceptorUtils

{

     public static JavaBeanDataChangeInterceptor getInterceptor(

              Object obj)

     {

         if (!(obj instanceof Factory))

         {

              return null;

         }

         Factory f = (Factory) obj;

         Callback[] callBacks = f.getCallbacks();

         for (int i = 0, n = callBacks.length; i < n; i++)

         {

              Callback callBack = callBacks[i];

              if (callBack instanceof JavaBeanDataChangeInterceptor)

              {

                   return (JavaBeanDataChangeInterceptor) callBack;

              }

         }

         return null;

     }

}

  这个 JavaBeanInterceptorUtils 只有一个方法 getInterceptor ,这个方法用于从一个被 CGLib 代理的 JavaBean 中取出拦截器 JavaBeanDataChangeInterceptor

  前边提到了, CGLib 实现拦截的方式就是生成被拦截类的子类,这个子类实现了 net.sf.cglib.proxy.Factory 接口,这个接口中有一个非常重要的方法 getCallbacks() ,通过这个方法我们可以得到所有的拦截器

4 主程序

public class MainApp

{

     public static void main(String[] args)

     {

         Enhancer enhancer = new Enhancer();

         enhancer.setSuperclass(PersonInfo.class);

         enhancer.setCallback(new JavaBeanDataChangeInterceptor());

 

         PersonInfo info = (PersonInfo) enhancer.create();

         // 对生成的 JavaBean 做一些初始化

         info.setAddress(" 地址 1");

         info.setAge(21);

         info.setName("tom");

 

         // 得到拦截器

         JavaBeanDataChangeInterceptor interceptor = JavaBeanInterceptorUtils

                   .getInterceptor(info);

         // 复位修改字段记录集合

         interceptor.reset();

 

         // JavaBean 做一些修改

         editPersonInf(info);

 

         // 得到修改了的字段

         Iterator it = interceptor.getChangedPropSet().iterator();

         while (it.hasNext())

         {

              System.out.println(it.next());

         }

     }

 

     private static void editPersonInf(PersonInfo info)

     {

         info.setName("Jim");

         info.setAddress("N.Y Street");

     }

}   

运行结果:

Address

Name

 

  这个“变化字段拦截器”是有一定实际意义的,比如可以用来实现“只保存修改了的字段以提高效率”等功能

 

  很多资料中都说如果要使用 JDK Proxy ,被代理的对象的类必须要实现接口,这种说法是不严谨的。从上边的例子我们可以看出,正确的说法应该是:如果要使用 JDK Proxy ,那么我们要通过代理调用的方法必须定义在一个接口中。“面向接口编程而不是面向实现编程”是 OOP 开发中的一条基本原则,因此这种限制并不会对我们的开发造成障碍。

上一页  [1] [2] 

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航