除了动态代理,还有哪些方法可以方便的自动帮我们生成类呢?
应该说,除了动态代理,还有注解和字节码注入(主要是asm和aspectj)两种方法可以方便的帮我们自动生成类。 关于字节码注入,我们下一节再说,今天只说注解,尤其是编译期注解,运行时注解因为大量要在运行期用到反射 所以很多人都不用了改用编译期注解了。比方说eventbus这个框架 2.0到3.0 主要就是修改的这个。所以运行时z 注解就留给感兴趣的人自己看看吧,比编译期注解简单多了
编译期注解能帮我们解决什么问题?
假设现在有个需求: 输入商品编码,返回对应的服装品牌并输出他们的价格。 显然这是一个工厂模式就能解决的简单问题。 首先定义一个接口:
package com.longfor.retentiontest;
public interface IClothes {
void getPrice();
}
复制代码
然后定义三个服装品牌
package com.longfor.retentiontest;
import android.util.Log;
import com.longfor.annotationprocessorjavalib.Factory;
public class BandNike implements IClothes {
@Override
public void getPrice() {
Log.v("wuyue", "nike price is 500");
}
}
复制代码
package com.longfor.retentiontest;
import android.util.Log;
import com.longfor.annotationprocessorjavalib.Factory;
public class BandLevis implements IClothes {
@Override
public void getPrice() {
Log.v("wuyue", "levis price is 5000");
}
}
复制代码
package com.longfor.retentiontest;
import android.util.Log;
import com.longfor.annotationprocessorjavalib.Factory;
public class BandGucci implements IClothes {
@Override
public void getPrice() {
Log.v("wuyue", "gucci price is 5000");
}
}
复制代码
然后一个工厂解决我们所有问题:
package com.longfor.retentiontest;
public class ClothesFactory {
public static IClothes getBandClothesByNumber(int number) {
if (number == 1) {
return new BandNike();
} else if (number == 2) {
return new BandGucci();
} else if (number == 3) {
return new BandLevis();
}
return null;
}
}
复制代码
这段代码其实还有优化空间的,比如说这品牌我们暂时只有3个,如果新增到30个 300个 怎么处理?尤其是这个方法要提供 给别的模块使用的时候?不能每新加一个就重新写一遍工厂类 重新打包吧。
所以解决问题的方法就是:用编译期注解的方法 来动态的帮我们生成工厂类,然后新增的品牌只要加上我们的注解就ok。 因为编译期注解生成的工厂类 会根据我们的注解来写好对应的语句。
如何在 androidstudio中 编写编译期注解代码
首先我们new一个java lib
注意他的build文件的写法: