@SuppressWarning 支持的参数如下及使用方式见这篇 @SuppressWarning 使用及支持的参数.
修饰其他注解的注解称为 "元注解"。
创建注解时,需要声明的类型为 @interface,看起来和接口有一些相似哈,其中的 @ 标明这是一个注解类型( "at ~ annotation type"):
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- public @interface ContentView {
- //属性叫 value ,在使用时可以直接传参数即可,不必显式的指明键值对,是一种快捷方法
- int value();
- }
注解除了名字和接口有些相似,内容也很相似,都是声明一个方法,规定返回值,不同的是这里的方法其实是个属性,返回值规定了属性的类型(至于为什么要声明成方法而不是属性,可能是为了后续直接使用这个方法获取值比较直观吧)。
注意:如果你的注解中创建了多个属性,但是使用时只需要使用某几个,这时编译器会提示你有没有指明的属性。
我们可以使用 default … 为注解的某个属性指定默认值,这样即使不指定某个属性,编译器也不会报错。这通常可以节约很多时间,比如这样:
- @Retention(RetentionPolicy.SOURCE)
- @Target(ElementType.TYPE)
- public @interface Author {
- String name() default "shixinzhang";
- String date();
- }
当我们使用 @Author 时没有指定 name = XXX,则会默认为 "shixinzhang"。
注解可以用来修饰类、方法、参数等等,具体的使用场景有以下三种:
注解处理器分为两种:
先介绍简单的一种:运行时注解处理器。
运行时注解需要使用 注解 + 反射,非常简单。
我们先自定义一个
注解,表示当前布局对应的 layout 文件:
- ContentView
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- public @interface ContentView {
- //属性叫 value ,在使用时可以直接传参数即可,不必显式的指明键值对,是一种快捷方法
- int value() ;
- }
然后用它修饰一个 Activity:
- @ContentView(R.layout.activity_annotation)
- public class AnnotationTestActivity extends BaseActivity {
- @Override
- protected void onCreate(@Nullable final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState); //调用父类的 onCreate
- setContentView(R.layout.activity_annotation);
- }
- }
在 BaseActivity 中反射获取当前类使用的注解,拿到注解的值,就可以直接设置布局了:
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- annotationProcess();
- }
- //读取注解,进行处理
- private void annotationProcess() {
- Class c = this.getClass();
- //遍历所有子类
- for (; c != Context.class; c = c.getSuperclass()) {
- //找到使用 ContentView 注解的类
- ContentView annotation = (ContentView) c.getAnnotation(ContentView.class);
- if (annotation != null) {
- try { //有可能出错的地方都要 try-catch
- //获取 注解中的属性值,为 Activity 设置布局
- this.setContentView(annotation.value());
- } catch (RuntimeException e) {
- e.printStackTrace();
- }
- return;
- }
- }
- }
这样就简单实现了运行时根据注解动态设置布局的功能。
黑科技、低性能
使用注解往往可以实现用非常少的代码作出匪夷所思的事情,比如 ButterKnife。
但被人诟病的是,运行时注解需要使用大量 Java 反射而引起较为严重的性能问题。
在使用运行时注解时需要小心,在调用方法时注意对异常的捕获,避免调用失败。
下一篇文章我们了解更为高性能的注解:使用编译时注解简单实现类似 ButterKnife 的效果。
https://docs.oracle.com/javase/tutorial/java/annotations/index.html
http://tutorials.jenkov.com/java/annotations.html
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
http://blog.csdn.net/duo2005duo/article/details/50505884
http://lrd.ele.me/2016/07/17/ Android 编译时注解框架系列 1 - 什么是编译时注解 /
来源: http://blog.csdn.net/u011240877/article/details/74486834