知识大全 CGLib实现变化字段探测的供能

Posted

篇首语:树高千尺有根,水流万里有源。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 CGLib实现变化字段探测的供能相关的知识,希望对你有一定的参考价值。

CGLib实现变化字段探测的供能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  为了巩固 CGLib 的知识 下面我们实现一个稍微复杂一点的例子

  例 请实现一个拦截器 使其能够检测一个 JavaBean 的哪些字段改变了

  ( )首先定义一个 JavaBean

  public class PersonInfo

  

  private String name;

    

  private String email;

    

  private int age;

    

  private String address;

    

  public String getEmail()

  

  return email;

  

    

  public void setEmail(String email)

  

  this email = email;

  

    

  public String getName()

  

  return name;

  

    

  public void setName(String name)

  

  this name = name;

  

    

  public String getAddress()

  

  return address;

  

    

  public void setAddress(String address)

  

  this address = address;

  

    

  public int getAge()

  

  return age;

  

    

  public void setAge(int age)

  

  this age = age;

  

  

  ( )定义一个 MethodInterceptor 这一步是最关键的

  import java lang reflect Method;

  import java util Collections;

  import java util HashSet;

  import java util Set;

    

  import net sf cglib proxy MethodInterceptor;

  import net sf cglib proxy MethodProxy;

    

  public class JavaBeanDataChangeInterceptor implements MethodInterceptor

  

  private static final String SET = set ;

    

  private Set changedPropSet;

    

  public JavaBeanDataChangeInterceptor()

  

  changedPropSet = new HashSet();

  

    

  public Object intercept(Object obj Method method Object[] args

  MethodProxy proxy) throws Throwable

  

  String name = method getName();

  if (name startsWith(SET))

  

  String s = name substring(SET length());

  changedPropSet add(s);

  

  return proxy invokeSuper(obj args);

  

    

  public Set getChangedPropSet()

  

  return Collections unmodifiableSet(changedPropSet);

  

    

  public void reset()

  

  changedPropSet clear();

  

  

  定义一个集合 changedPropSet 用来存放修改了的字段名 增加了一个方法 reset 用来清空此集合 增加了一个 getChangedPropSet 方法用来供外界得到修改了的字段 为了防止调用者对 changedPropSet 做修改 因此我们采用 Collections unmodifiableSet 对返回的集合进行不可修改的修饰

  在 intercept 方法中 我们判断如果被调用的方法以 set 开头 则把此字段名放入 changedPropSet 集合中

  ( )定义剖析用工具

  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 = 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() 通过这个方法我们可以得到所有的拦截器

  ( ) 主程序

  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( 地址 );

  info setAge( );

  info setName( tom );

    

  // 得到拦截器

  JavaBeanDataChangeInterceptor interceptor = JavaBeanInterceptorUtils

   getInterceptor(info);

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

  interceptor reset();

    

  // 对 JavaBean 做一些修改

  editPersonInf(info);

    

  // 得到修改了的字段

  Iterator it = interceptor getChangedPropSet(erator();

  while (it hasNext())

  

  System out println(it next());

  

  

    

  private static void editPersonInf(PersonInfo info)

  

  info setName( Jim );

  info setAddress( N Y Street );

  

     

  运行结果

  Address

  Name

    

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

    

cha138/Article/program/Java/hx/201311/26735

相关参考

知识大全 短跑100200400肌肉供能顺序及供能时间

短跑100\\200\\400肌肉供能顺序及供能时间我是中学田径队教练,我来帮助你~你的那几种练习方法可以提高短跑水平,但需要更科学的安排。一周训练人体运动的能源?人在进行体育锻炼时,体内新陈代谢过程

知识大全 字段对象的概念和字段对象的建立

  数据集组件Table用于与数据表连接如与学生档案表XA连接数据表通常由若干个字段组成如XA由XAXA…XA共个字段组成实现对数据表中各个字段的数据处理就要用到字段对象TField  TField对

知识大全 sql实现多字段求和并查询

  下面就sql多字段求和并作为sql查询条件的方法进行了说明供您参考希望对您学习sql查询方面有所帮助  做一个字段求和的小sql查询查询一个表中字段字段和字段之和大于的结果故写了如下的SQL语句 

知识大全 删除完全重复和部分关键字段重复的记录

  重复记录分为两种第一种是完全重复的记录也就是所有字段均重复的记录第二种是部分关键字段重复的记录例如Name字段重复而其它字段不一定重复或都重复  第一种重复很容易解决不同数据库环境下方法相似  M

肥胖患者如何运动?

减肥运动为中等强度、长时间运动。中等强度运动量可以消除脂肪而不至于增加肌肉。长时间运动是由于运动开始20分钟内,人体主要利用血糖供能,超过20分钟才开始动用脂肪供能,因此一次运动至少持续30分钟以上才

肥胖患者如何运动?

减肥运动为中等强度、长时间运动。中等强度运动量可以消除脂肪而不至于增加肌肉。长时间运动是由于运动开始20分钟内,人体主要利用血糖供能,超过20分钟才开始动用脂肪供能,因此一次运动至少持续30分钟以上才

知识大全 sql判断且增加字段ADD

sql判断且增加字段ADD  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  sql判断且增加字段l

知识大全 Quota相关字段

Inode结构:Quota相关字段  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在前面讲sup

知识大全 Mysql字段长度

数据库人员手边系列:Mysql字段长度  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  列类型需要

知识大全 HTTP消息头字段

Java网络编程从入门到精通(23):HTTP消息头字段  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下