android方法注释,android注解的使用

更新时间:2023-07-15 13:07:56 阅读: 评论:0

android⽅法注释,android注解的使⽤
前⾔
学硕国家线
教师考编制条件是什么对注解,⼀开始是在学习java的时候接触到的,就是在《Thinking in Java》⾥草草看过。后来开发android,⾃⼰接了项⽬时,把
基础概况
注解是Java SE5中的重要特性,也被称为元数据。为我们在代码中添加信息提供⼀种形式化的⽅式,使我们可以在稍后某个时刻⾮常⽅便地使⽤这些数据。主要作⽤:
可以由编译器来测试和验证格式
存储有关程序的额外信息
可以⽤来⽣成描述符⽂件或新的类定义
减少编写样板代码的负担
分类
根据注解中成员个数(0个,1个,多个)把注解分为:标记注解,单值注解,完整注解
也可以根据把注解的来源分为jdk⾃带的,元注解,和我们⾃⼰定义的注解
1. Java SE5中⾃带了三种标准注解
@Override 表⽰当前的⽅法定义将覆盖超类中的⽅法
@Deprecated 表⽰废弃的意思,使⽤了该注解的⽅法或者对象,则会有提⽰。
@SuppressWarnings 关闭不当的编译器警告信息
java 8新特性:加⼊了 @Repeatable注解,允许多次使⽤同⼀个注解
@Repeatable(Authorities.class)
public @interface Num{
int value();
}
public class Opera{
@Num(value = 1)
@Num(value = 2)
public void add(){ }
}
2. Java SE5中还有四个元注解,元注解专职负责注解其他注解。在 java.lang.annotation下
元注解
作⽤
@Target
表⽰该注解可以⽤于什么地⽅,可能在ElementType参数包括
CONSTRUCTOR: ⽤于描述构造器FIELD: ⽤于描述域LOCAL_VARIABLE: ⽤于描述局部变量METHO
D: ⽤于描述⽅法PACKAGE: ⽤于描述包PARAMETER: ⽤于描述参数TYPE: ⽤于描述类、接⼝(包括注解类型) 或enum声明
表⽰需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
流行女装
SOURCE: 注解将被编译器丢弃CLASS: 注解在class⽂件中可⽤,但会被VM丢弃。RUNTIME: VM将在运⾏期也保留注解,因此可以通过反射机制读取注解的信息
@Document
将此注解包含在javadoc中
@Inhrited
允许⼦类继承⽗类中的注解
java 8新特性:java 8之前注解只能是在声明的地⽅所使⽤,⽐如类,⽅法,属性;java 8⾥⾯,注解可以应⽤在任何地⽅,⽐如⽅法参数前⾯等。
3.⾃定义注解
先写⼏个简单的注解:
没有元素的标记注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
单值注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Num {
int value();
}
完整注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
int[] value();
int[] parentId() default 0;
Class> type() default View.OnClickListener.class;
String tter() default "";
String method() default "";
}
⾃定义注解格式:
public @interface 注解名{注解体}。注解体中注解元素可以被public修饰,也可以什么也不写,元素类型可以是:
桃花岭所有基本数据类型(int,float,boolean等)
Class类型
enum类型
付款申请书范本
Annotation类型(说明注解可以嵌套)
以上所有类型的数组
默认值的限定:
编译器对默认值过分的挑剔,要么有确定的默认值,要么在使⽤的时候提供元素的值。
基本类型的元素都有默认值,不⽤写default也可以,但是想String这类就必须要写,⽽且不能写null,因此在某些需要分清是null还是空字符串的地⽅要注意。
4. 注解的使⽤
@Event(value = R.id.btn_test1, type = View.OnClickListener.class)
private void onTestClick(View view) {
……
}
注解元素使⽤时变现为键值对的形式,如上的value=R.id.btn_test1,没有赋值的就⽤默认的值了。
当然为了简便,也可以直接写上值,特别是单值注解
@Num (2)
class Goods {
……
}
5. 注解处理器类库的使⽤
如果没有⽤来读取注解的⼯具,那注解也不会⽐注释更有⽤。使⽤注解的过程中很重要的⼀个部分就是创建与使⽤注解处理器。Java SE5扩展了反射机制的API,在flect 包下新增了AnnotatedElement接⼝,该接⼝代表程序中可以接受注解的程序元素,以下是源码,不要看到接⼝⾥的⽅法有具体实现感到惊讶(Java 8允许我们给接⼝添加⼀个⾮抽象的⽅法实现,只需要使⽤ default关键字即可,这个特征⼜叫做扩展⽅法),原来的注释太长我去掉了,写上简单的汉字注释,java 8⽐起之前新增了两个⽅法。
public interface AnnotatedElement {
//该元素是否被注解标记了
default boolean isAnnotationPrent(Class extends Annotation> annotationClass) {
return getAnnotation(annotationClass) != null;
}
//获取该元素指定注解类型的值
T getAnnotation(Class annotationClass);
//获取该元素所有的注解
Annotation[] getAnnotations();
//1.8新增,返回重复注解(@Repeatable)的类型
default T[] getAnnotationsByType(Class annotationClass) {
T[] result = getDeclaredAnnotationsByType(annotationClass);
什么是早恋
if (result.length == 0 && // Neither directly nor indirectly prent
this instanceof Class && // the element is a class
if (superClass != null) {
// Determine if the annotation is associated with the
// superclass
result = AnnotationsByType(annotationClass);
}
}
return result;
}
//返回直接存在于此元素上的所有注释,不考虑继承下来的
default T getDeclaredAnnotation(Class annotationClass) {
// Loop over all directly-prent annotations looking for a matching one for (Annotation annotation : getDeclaredAnnotations()) {
if (annotationClass.equals(annotation.annotationType())) {
// More robust to do a dynamic cast at runtime instead
// of compile-time only.
return annotationClass.cast(annotation);
}
}
return null;
}
//1.8新增,返回直接或者间接标记在该元素的注解类型,不考虑继承。
default T[] getDeclaredAnnotationsByType(Class annotationClass) { quireNonNull(annotationClass);
return AnnotationSupport.
getDirectlyAndIndirectlyPrent(Arrays.stream(getDeclaredAnnotations()). Map(Annotation::annotationType, Function.identity(), ((first, cond) -> first), Link
edHashMap::new)), annotationClass);
}
Annotation[] getDeclaredAnnotations();
}
该接⼝主要有如下⼏个实现类:
Class:类定义
Constructor:构造器定义
Field:累的成员变量定义
Method:类的⽅法定义
Package:类的包定义
通过反射获取成员名再获取注解值得⼀般写法,同样的可以通过反射获取⽅法等励志演讲
Field fields[] = DeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPrent(Num.class)) {
Num num= Annotation(Num.class);
……
}
……
}
在⽹上找到了⼀张注解的提纲,⾮常详细,除了没有java 8⾥注解新特性,这⾥引⽤下:
故事女朋友注解提纲
讲了这么多,都是纯java和运⾏时注解的,下⾯开始结合Android Studio讲讲编译时注解
APT
讲编译时注解,先了解下注解处理器⼯具APT(Annotation Processing Tool)
APT(Annotation processing tool)是⼀种处理注释的⼯具,它对源代码⽂件进⾏检测找出其中的Annotation,使⽤Annotation进⾏额外的处理。可以在编译时进⾏注解处理,也可以在运⾏时通过反射API进⾏注解处理。编译时进⾏注解处理是根据源⽂件中的Annotation⽣成额外的源⽂件和其它的⽂件,将它们⼀起⽣成class⽂件。
使⽤APT主要的⽬的是简化开发者的⼯作量,因为APT可以编译程序源代码的同时,⽣成⼀些附属⽂件(⽐如源⽂件,类⽂件,程序发布描述⽂件等),这些附属⽂件的内容也都是与源代码相关的,换句话说,使⽤APT可以代替传统的对代码信息和附属⽂件的维护⼯作。
下⾯将结合Android Studio实现编译时注解,主要内容来⾃这篇⽂章:THE 10-STEP GUIDE TO ANNOTATION PROCESSING IN ANDROID STUDIO。先看下项⽬的结构,如果是第⼀次尝试,包名最好先完全⼀样,省的哪⾥出错。
项⽬.png
新建⼀个android项⽬ AnnotationProcessor,包名为com.stablekernel.annotationprocessor,再建⼀个Java Library 的module,如下图所⽰
构建注解module

本文发布于:2023-07-15 13:07:56,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1097909.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:注解   元素   信息   类型   标记   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图