内容简介:java进阶之自定义注解
注解是 Java 1.5引入的,可以提供代码的额外信息,目前正在被广泛应用。除了Java内置注解,我们也可以自定义注解。
以下就是一个自定义注解的简单例子:
@Target(ElementType.TYPE) //注解作用于类型(类,接口,注解,枚举)
@Retention(RetentionPolicy.RUNTIME) //运行时保留,运行中可以处理
@Inherited // 注解将被用于该类的子类
@Documented // 生成javadoc文件
public @interface JsAnnotation {
String DEFAULT_VALUE = "JS";
/**
* 创建此value方法,则使用注解时可直接传参,如 @JsAnnotation("msg")
*
* @return
*/
String value() default DEFAULT_VALUE;
}
自定义注解关键点:
- @interface关键字定义注解
- 注解可以被其它注解修饰,最重要的就是元注解
- 注解和接口类似,内部可以定义常量和方法
- 注解定义的方法有一些限制:方法不能有参数;返回值只能是基本类型、字符串、Class、枚举、注解、及以上类型的数组;可以包含默认值
二、元注解介绍
元注解就是定义注解的注解。
包含@Target、@Retention、@Inherited、@Documented这四种
1、@Target
描述注解的使用目标。
其源码为:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Target {
ElementType[] value();
}
注解方法返回值是ElementType[],ElementType枚举类型,枚举值就是@Target注解的可取值。
方法名value,这样在使用注解时,可以不需要指定方法名。
可取的值有:
| 取值 | 含义 |
|---|---|
| ElementType.PACKAGE | 注解作用于包 |
| ElementType.TYPE | 注解作用于类型(类,接口,注解,枚举) |
| ElementType.ANNOTATION_TYPE | 注解作用于注解 |
| ElementType.CONSTRUCTOR | 注解作用于构造方法 |
| ElementType.METHOD | 注解作用于方法 |
| ElementType.PARAMETER | 注解作用于方法参数 |
| ElementType.FIELD | 注解作用于属性 |
| ElementType.LOCAL_VARIABLE | 注解作用于局部变量 |
注意:默认可以作用于以上任何目标。
2、@Retention
描述注解的生命周期。
其源码为:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
RetentionPolicy value();
}
注解方法返回值是枚举类型RetentionPolicy,枚举值就是@Retention注解的可取值。
可取的值有:
| 取值 | 含义 |
|---|---|
| RetentionPolicy.SOURCE | 源码中保留,编译期可以处理 |
| RetentionPolicy.CLASS | Class文件中保留,Class加载时可以处理 |
| RetentionPolicy.RUNTIME | 运行时保留,运行中可以处理 |
默认RetentionPolicy.CLASS 值。
3、@Documented
描述注解可以文档化,是一个标记注解。
在生成javadoc的时候,是不包含注释的,但是如果注解被@Documented修饰,则生成的文档就包含该注解。
其源码为:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}
4、@Inherited
标记注解,使用@Inherited修饰的注解作用于一个类,则该注解将被用于该类的子类。
其源码为:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}
三、自定义注解示例
1、定义注解
@Target(ElementType.TYPE) //注解作用于类型(类,接口,注解,枚举)
@Retention(RetentionPolicy.RUNTIME) //运行时保留,运行中可以处理
@Inherited // 注解将被用于该类的子类
@Documented // 生成javadoc文件
public @interface JsAnnotation {
String DEFAULT_VALUE = "JS";
/**
* 颜色枚举
*
* @author peida
*/
enum Color {
BULE, RED, GREEN
}
/**
* 创建此value方法,则使用注解时可直接传参,如 @JsAnnotation("msg")
*
* @return
*/
String value() default DEFAULT_VALUE;
/**
* 此方法返回为枚举类型,使用注解时,如 @JsAnnotation(color=Color.BLUE)
*
* @return
*/
Color color() default Color.BULE;
int num() default -1;
}
其中:定义了三个方法,三个方法都有默认返回值。定义了Color枚举(因为注解的方法可以返回枚举类型)
这里注意:
- value方法:使用注解时可直接传参,如 @JsAnnotation("msg")
- 普通方法:使用注解时,如 @JsAnnotation(color=Color.BLUE)
2、使用注解
@JsAnnotation("jia shuai")
public class AnnotationTest {
}
或
@JsAnnotation(num = 100)
public class AnnotationTest {
}
或
@JsAnnotation(color = Color.BLUE)
public class AnnotationTest {
}
3、获取注解
public static void main(String[] args) {
AnnotationTest test = new AnnotationTest();
Class tClass = test.getClass();
JsAnnotation jsAnnotation = (JsAnnotation) tClass.getAnnotation(JsAnnotation.class);
System.out.println(jsAnnotation.value());
System.out.println(jsAnnotation.color());
System.out.println(jsAnnotation.num());
}
更多精彩内容关注我的微信公众号—— Android机动车
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Operating System Algorithms
Nathan Adams、Elisha Chirchir / CreateSpace Independent Publishing Platform / 2017-4-21 / USD 39.15
Operating System Algorithms will walk you through in depth examples of algorithms that you would find in an operating system. Selected algorithms include process and disk scheduling.一起来看看 《Operating System Algorithms》 这本书的介绍吧!