Android程序员必会技能---运行时动态生成类---之编译期注解

除了动态代理,还有哪些方法可以方便的自动帮我们生成类呢?

应该说,除了动态代理,还有注解和字节码注入(主要是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文件的写法:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,但是我没有找到关于程序员编程艺术1-38的PDF。根据引用\[1\]中的信息,程序员编程艺术的总结只包括前二十二章。引用\[3\]提供了一个下载地址,但是只包含了前37章的PDF。所以,目前我无法提供程序员编程艺术1-38的PDF下载地址。 #### 引用[.reference_title] - *1* [程序员编程艺术第一~二十七章集锦与总结(教你如何编程),及PDF免分下载](https://blog.csdn.net/v_JULY_v/article/details/7506231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [程序员编程艺术第二十五章:Jon Bentley:90%无法正确实现二分查找](https://blog.csdn.net/iteye_20954/article/details/82237124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [程序员编程艺术第一~三十八章集锦与总结,及Github地址、PDF下载](https://blog.csdn.net/v_JULY_v/article/details/17303459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值