Android编译时注解实践指南

   2016-12-01 0
核心提示:Android注解分为两种,一种是运行时注解,一种是编译时注解。RxJava就是运行时注解,而butterKnife和EventBus是编译时注解,啃代码的时候经常碰到注解,所以只能乖乖的学习。本文主要讲解演示如何在Android Studio上运行一个编译时注解的Demo,被注解的对象打

Android注解分为两种,一种是运行时注解,一种是编译时注解。RxJava就是运行时注解,而butterKnife和EventBus是编译时注解,啃代码的时候经常碰到注解,所以只能乖乖的学习。本文主要讲解演示如何在Android Studio上运行一个编译时注解的Demo,被注解的对象打印出该对象的信息。

1.新建一个Java Library项目

在Android Studio中先新建一个Android project。在Android project 中选中File->New->New Module…选择 Java Library 新建一个module。因为注解中用到Java库,所以必须要导入Java Library.

Android编译时注解实践指南 Android编译时注解实践指南

新建的Android项目名叫At(Annotation),Java Library名字是at2.

Android编译时注解实践指南

2.编写注解类

在at2项目中,新建一个PrintInject,加入以下代码声明一个注解类,注解类的类型是@interface

/**
 * Author      :  yuanjunli
 * Create Time :  2016/10/19 13:50
 * Email       : 878715255@qq.com
 */
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})  //声明此类可以注解的对象
@Retention(RetentionPolicy.CLASS)                                   //编译时运行
public @interface PrintInject {                                     //@interface声明
        intvalue();                                                //定义有一个int参数
}

@Target(ElementType.TYPE) //接口、类、枚举、注解

@Target(ElementType.FIELD) //字段、枚举的常量

@Target(ElementType.METHOD) //方法

3.注册声明方法

在他项目中,新建一个PrintInjectProcessor,键入以下代码:

@SupportedAnnotationTypes("com.example.PrintInject")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public classPrintInjectProcessorextendsAbstractProcessor{
    @Override
    publicbooleanprocess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
        Messager messager = processingEnv.getMessager();
        for (TypeElement te : annotations) {
            for (Element e : roundEnv.getElementsAnnotatedWith(te)) {
                messager.printMessage(Diagnostic.Kind.NOTE, "Printing: " + e.toString());
            }
        }
        return true;
    }
}

@SupportedAnnotationTypes:指定该注解起作用的类;

@SupportedSourceVersion(SourceVersion.RELEASE_7):指定jdk的版本;

AbstractProcessor:自定义的声明需要继承AbstractProcessor,重点实现process方法;

processingEnv:注解框架提供的工具集合,在此demo中取到message对象打印信息。打印的信息在android studio中 Gradle Console 切页中显示;

TypeElement:是注解的类型;

以上的代码就是获取所有自定义的注解并且通过 e.toString() 打印注解类的信息。

4.创建路径文件

在resources路径文件夹下创建一个META-INF文件夹,META-INF下面创建一个services文件夹,在里边创建一个javax.annotation.processing.Processor文件,此文件路径不能出错。在文件中写入注解路径的声明,本项目路径是 com.example.PrintInjectProcessor
Android编译时注解实践指南 如图检查Processor放置的路径是否一样。

5.生成编译注解at2的jar包

经过以上操作,编写了一个 @PrintInject 的声明,当对象被@PrintInject声明时,在项目编译时就会打印对象的信息。接下来单独编译运行at2 这个module,导出该jar包。

Android编译时注解实践指南

在android studio 右侧打开Gradle切页,如果没有显示项目的gradle,点击gradle按钮编译一下,如上图,打开:at2->Tasks ->build 双击里边的build文件。编译成功后会如下图所示在项目build->libs目录下生成一个at2.jar.

Android编译时注解实践指南

6.demo测试

将at2.jar copy 到at主项目的libs文件夹下,生成android项目时在app/build.gradle文件下有 compile fileTree(dir: 'libs', include: ['*.jar']) 为自动导入jar。编写MainActivity代码如下:

public classMainActivityextendsAppCompatActivity{

    @Override
    @PrintInject(1)
    protectedvoidonCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
}

@PrintInject(1) 在方法onCreate()上添加注解,int参数为1。接着看编译运行demo后,message的输出并不在Message切页,也不知Log里边,是在 Gradle Console 下。需要注意,第一次运行项目的时候会有message输出,当再次运行时并没有,因为第二次无须再次编译,如果需要再次看到输出的信息,可以Build->Clean Project。

Android编译时注解实践指南
 
标签: Java 安卓开发
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • SDK热更之如何在SDK代码中自动插桩及如何生成补
    写在前面本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接:SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.htmlSDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix这篇文章主要介绍一下SDK热更
  • ASimpleCache
    ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。1、它可以缓存什么东西?普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 byte数据。2、它有什么特色?特色主要是
    02-05 Java开源
  • 原生App与javascript交互之JSBridge接口原理、
    前期调研调研对象:支付宝,微信,云之家调研文档:Android中JS与Java的极简交互库 SimpleJavaJsBridge设计需求阅读类型的业务功能页面需要由前端H5实现,需要做到服务端可控;页面界面更改减少重新发布新版本的频率;功能页面部分原型需求无法实现,需要原生
  • RxJava系列番外篇:一个RxJava解决复杂业务逻辑
    之前写过一系列RxJava1的文章,也承诺过会尽快有RxJava2的介绍。无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨。所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家在使用RxJava的时候有一点点启发。对RxJava还不了解的同学可以先去看看
  • 框架Robust原理解析(下)
    框架Robust原理解析(下)
    一、回顾框架原理本篇继续来看热修复框架Robust原理,在之前的一篇文章中已经详细讲解了:Robust框架原理,因为这个框架不是开源的,所以通过官方给出的原理介绍,咋们自己模拟了案例和框架逻辑的简单实践。最后在通过反编译美团app进行验证咋们的逻辑实现是
  • 使用Smalidea对无源码APK调试简介
    阅读:8最近正好也用了Smalidea,就ZZ的原贴做一些补充。可调试APP如果Android的系统属性ro.debuggable等于1(用getprop ro.debuggable验证),则所有APP都可调试。如果ro.debuggable等于0,某APP的AndroidManifest.xml中有android:debuggable=”true”,该APP
    01-06 JavaLinux
  • 年度盘点(四) | 2016 年十大 Java / Android 开发者必读好文
    年度盘点(四) | 2016 年十大 Java / Android
    2016 年已经过去,感谢大家支持开发者头条。 年度盘点第四篇: 2016 年十大 Java / Android 开发者必读好文 。 长按识别文章摘要下方二维码,即可进入文章评论页。0. 推荐几个自己写的 Java 后端相关的范例项目这里推荐几个自己写的范例项目,主要采用 SSM(S
  • 8个华丽而实用的Java图表类库
    8个华丽而实用的Java图表类库
    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码: 589809992 我们一起学Java! 前段时间我们为大家分享过一些最常用的Java图表应用和Android图表应用,无论是在PC平台上还是移动平台上,图表和报
  • 第151期:一个RxJava解决复杂业务逻辑的案例
    第151期:一个RxJava解决复杂业务逻辑的案例
    第151期:一个RxJava解决复杂业务逻辑的案例深度讨论 基本特效:饿了么丝滑无缝过度搜索栏的实现 diycode 帖子优先,就给上个头条吧。Android开发 一个RxJava解决复杂业务逻辑的案例 本文给大家分享一个使用RxJava解决问题的案例,希望对大家在使用RxJava的时
  • Eclipse 集成ijkplayer demo
    Eclipse 集成ijkplayer demo
    接着上一篇在Mac上编译ijkplayer的.so,现在将这些文件夹拷贝到windows上。(在mac和winds上集成到eclipse上是一样的,只是我这mac上没有安装eclipse)。现在开始说集成到Eclipse的步骤:1 更改目录结构 以 ijkplayer-armv7a 文件夹为例,删除选中的这四个文件
    12-23 EclipseJava
点击排行