标签:eth 并且 rda 修饰符 请求 set androi mys show
转:
An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.
创建自定义Annotation流程
public @interface CustomAnnotation{***}
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public @interface CustomAnnotation{***}
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public @interface CustomAnnotation{
//注解参数类型可以是1-6中任一种,包括枚举
public enum Skill{JAVA,ANDROID,IOS}
Skill mySkill() default Skill.ANDROID;
String attr1();
//可以使用default设置默认值
int attr2() default 100;
//修饰符只能用public
public boolean attr3() default false;
}
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.TYPE )
public @interface CustomAnnotation{
//只有一个注解参数,使用value()
String value();
}
自定义Annotation的注解参数的默认值
注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。
示例:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnotherAnnotation{
String author() default "";
int age() default -1;
}
使用刚刚创建的自定义注解
@CustomAnnotation(attr1 = "属性1", attr2 = 90, attr3 = true)
public class AnnotationTestClass{
***
}
运行时 Annotation 指 @Retention 为 RUNTIME 的 Annotation
- Class,Method,Field中都有以下3个方法可以调用
- public <T extends Annotation> T getAnnotation(Class<T> annotationClass) 按照传入的参数获取指定类型的注解。返回null说明当前元素不带有此注解。
- public final boolean isAnnotationPresent(Class<? extends Annotation> annotationType) 检查传入的注解是否存在于当前元素。
- public Annotation[] getAnnotations() 返回该元素的所有注解,包括没有显式定义该元素上的注解。
- 运行时 Annotation 解析示例
public void testCustomAnnotation() { try { Class cls = Class.forName("com.jet.annotation.AnnotationTestClass"); CustomAnnotation customAnnotation = (CustomAnnotation)cls.getAnnotation(CustomAnnotation.class); System.out.println("customAnnotation mySkill:" + cus.mySkill()); System.out.println("customAnnotation attr1:" + cus.attr1()); System.out.println("customAnnotation attr2:" + cus.attr2()); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
编译时 Annotation 指 @Retention 为 CLASS 的 Annotation,甴编译器自动解析
编译时Annotation解析 相对复杂,下面单独进行分析
首先申明:下面内容仅仅讨论 编译时Annotation的解析
public abstract class AbstractProcessor implements Processor {
//对一些工具进行初始化
public synchronized void init(ProcessingEnvironment processingEnv)
//你在这里定义你的注解处理器注册到哪些注解上,必须指定;
//它的返回值是一个字符串的集合,包含本处理器想要处理的注解类型的合法全称
public Set<String> getSupportedAnnotationTypes()
//指定该注解处理器使用的JAVA版本,通常返回SourceVersion.latestSupported()
public SourceVersion getSupportedSourceVersion()
//真正生成java代码的地方
//annotations:请求处理的注解类型集合
//roundEnv:可以让你查询出包含特定注解的被注解元素,相当于“有关全局源码的上下文环境”
//如果返回 true,则这些注解已声明并且不要求后续 Processor 处理它们;
//如果返回 false,则这些注解未声明并且可能要求后续 Processor 处理它们
public abstract boolean process(Set<? extends TypeElement> annotations,RoundEnvironment roundEnv)
}
关于编译时Annotation解析,这里推荐一篇文章【Android】注解框架(三)-- 编译时注解,手写ButterKnife,按照文章上面流程敲一遍代码,相信可以对自定义注解的创建及解析有一个深入的了解!
标签:eth 并且 rda 修饰符 请求 set androi mys show
原文地址:https://www.cnblogs.com/libin6505/p/11227101.html