简述
从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
博主将从以下几个方面给大家介绍一下Java的注解。希望大家能在日常开发中用到注解,感受注解的魅力!
- 注解简要介绍
- 自定义注解
1 注解简要介绍
在写Java时,我们会经常用到注解,比如,
@Deprecated 所标注内容,不再被建议使用。
@Override 只能标注方法,表示该方法覆盖父类中的方法。
@Documented 所标注内容,可以出现在javadoc中。
@SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。
除了这些标记类、方法的注解外,还有四个比较特殊的元注解。
@Target
@Retention
@Documented
@Inherited
这四个注解是专门用来标记注解类的注解。
@Target
标明本注解用于什么地方。
public enum ElementType {
/** 类、接口(包括注释类型)或枚举声明 */
TYPE,
/** 字段声明(包括枚举常量) */
FIELD,
/** 方法声明 */
METHOD,
/** 参数声明 */
PARAMETER,
/** 构造方法声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注释类型声明 */
ANNOTATION_TYPE,
/** 包声明 */
PACKAGE,
/**
* 类型参数声明
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
@Retention
标记注解能够被保留多久。
public enum RetentionPolicy {
/**
* 注释将被编译器丢弃
*/
SOURCE,
/**
* 编译器会在类文件中记录注释,但运行时不需要被虚拟机保留。
*/
CLASS,
/**
* 运行时保留,可以被反射读取
*/
RUNTIME
}
@Documented
这个注解只是用来标注生成javadoc的时候是否会被记录。
@Inherited
被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
2 自定义注解
了解了一些常用注解后,我们来看看如何自定义注解,并获取注解内容使用。
===> 1.定义一个MyAnnotation注解,注解有一个参数需要输入【value】
@Target(ElementType.TYPE) // 类注解
@Retention(RetentionPolicy.RUNTIME) // 运行时有效
public @interface MyAnnotation {
String value();
}
===> 2.定义一个Flower类,使用该注解
@MyAnnotation("玫瑰花")
public class Flower {
}
===> 3.测试获取该注解中的内容
public class AnnotationTest {
public static void main(String[] args) {
try {
//获取Flower的Class对象
Class clazz = Flower.class;
//判断是否有注解MyAnnotation
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
//获取注解
MyAnnotation myAnnotation = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.value());
} else {
System.out.println("没有配置【MyAnnotation】注解!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
===> 结果如下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。