功能优点

Class织入功能是可以对已编译的类中的字段或方法进行二次修改,从而可以方便的对产品进行二次开发及功能扩展


缺点

1.由于更新了编译的class,在调试时无法跟踪到正确的行号,也不能正确的指定源码,所以调试起来比较困难

2.在对原class升级的时候也需要检查织入类,所以在升级产品时会增加部分工作量


所以应尽量少的使用该功能做二次开发


功能组成元素:

目标类

        被织入的目标类,可以是任何类型的java

存根类

        使用@WeaveStub注解标识,存根类用来罗列目标类的成员,从而方便调用目标类的字段或方法,在实际运作时它并不参与,只是为了方便调用目标类成员而存在(例如:可以通过存根类调用目标的私有成员)

织入类

        使用@Weaver注解标识,并由@Weaver注解value值指定目标类,织入类中的成员会替换目标类中的成员(字段、方法),在织入类中可以访问目标类的原有方法或字段

        织入类可以继承目标类或存根类,通过访问父类的成员来访问目标类的原方法,如果要访问的目标类成员是私有成员,则只能通过集成存根类来访问(需要在存根类中将成员标记为publicprotected)

        在织入类中可以通过super来访问目标类的方法,如果想要调用目标类的父类方法可以给方法添加@SuperInvoke注解,来标识此方法中的super关键字为目标类的父类

        在织入类中可以直接访问目标类的字段,如果目标类的字段被织入则会得到织入后的值,无法得到被织入前的值,这是因为织入行为是发生在类加载器载入类字节码之前

使用示例:

目标类:

存根类:

织入类:

测试调用类:

访问test输出结果: