使用ClassReplace无源码解决方法、字段的新增替换和修改

作者:  最后修改:2014年11月04日  浏览数:270

  ClassReplace支持方法、字段的新增替换和修改,该功能的使用方法非常简单,在Source类(以下简称“源类”)字段上加入@Replace注解即可替换该字段类型的类中的逻辑。如:

即表示替换Target类,以下简称“目标类”。

 
  如果想在Target类中调用Source类中的私有方法,则需要在source类中定义一个同名同参方法,方法的表现形式不限,然后在该方法上添加@Replace注解即可。
如:
或:

 

  之所以采用这种方式,而不是extends的方式,是因为考虑到希望能修改有final修饰的目标类。

 

  ClassReplace处理类织入的方式是运行时织入的,参与织入的源类不会被虚拟机加载,只会被织入器解析。源类不能被任何其他类引用及调用,它是以class形式存在WEB-INF/plugins/replace/classes目录或以jar的形势存在于WEB-INF/plugins/replace/lib目录中。容器及虚拟机不会加载这里的类文件和jar包。ClassReplace不会修改及影响目标类文件,只会在运行时在内存中修改目标类逻辑。

 

功能原则:对于源类中的方法和属性,如果目标类中存在,则替换,如目标类中不存在,则新增。方法以方法名称与参数区分,属性以属性名称区分,忽略且不影响属性修饰符,若不符合该原则,可能导致错误及异常(如:目标类中属性String t1,而在源类中的定义为int t1)

 

代码示例

 

Source类:

 

Target类:

 

 

调试:因为jvm的规范中,行号和source File无法指定为多个文件,所以依然无法做到调试时的自动文件定位,但是保存了Source类的行号,可以手动指定source文件调试。
 
更新:
2014年12月16日 target类现在无需和source类在一个包下了;