Java基础(二)-注解
2019-10-23 本文已影响0人
Stan_Z
一、注解定义
Java提供的一种源程序中的元素关联任何信息和任何元数据的途径和方法。我把它简单理解为一个标签。
Java SE5.0版本引入该概念。
二、注解介绍
1.JDK注解介绍
注解名 | 说明 |
---|---|
@Override | 重写 |
@Deprecated | 过时 |
@SuppressWarnings(“”) | 忽略警告 |
2.注解语法:
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String desc();
int age() default 18;
}
3.类定义:
使用@interface关键字定义注解
4.成员变量规范:
- 成员类型是受限的,合法类型包括:基本类型及String、Class、Annotation、Enumeration
- 如果注解只有一个成员变量,则命名必须为value(),在使用时可直接赋值
- 注解类可以没有成员,没有成员的注解称为标识注解
- 成员以无参无异常方式声明
- 可以用default为成员指定一个默认值
5.元注解说明:
注解名 | 作用域 | 说明 |
---|---|---|
@Target | ElementType.ANNOTATION_TYPE 给一个注解进行注解 ElementType.CONSTRUCTOR 构造方法 ElementType.FIELD 属性 ElementType.LOCAL_VARIABLE 局部变量 ElementType.METHOD 方法 ElementType.PACKAGE 包 ElementType.PARAMETER 方法参数 ElementType.TYPE 类、接口、枚举 |
限制的运行场景,可以多选,以”,”分隔。 |
@Retention | RetentionPolicy.SOURCE 只在源码显示,编译时丢弃 RetentionPolicy.CLASS 编译时记录到class中,运行时丢弃 RetentionPolicy.RUNTIME 运行时存在,可反射读取 |
生命周期 |
@Inherited | 允许子类继承 | |
@Documented | 生成javadoc时会包含注解 |
6.注解使用:
@注解名(成员名1=“成员值1”,成员名2=“成员值2”,...)
@Description(desc = “class annotation")
public class MyClass {
}
7.注解解析
通过反射获取类、函数或成员上的运行时注解信息,实现动态控制程序运行逻辑。
try {
Class clz = Class.forName("XXX");
/**
* 获取类上注解
*/
//类上是否存在该注解
boolean isExit = clz.isAnnotationPresent(Description.class);
if (isExit) {
//获取注解实例
Description desc = (Description) clz.getAnnotation(Description.class);
System.out.println(desc.value());
}
/**
* 获取方法上注解
*/
Method[] methods = clz.getMethods();
for (Method method : methods) {
boolean isMethodExit = method.isAnnotationPresent(Description.class);
if (isMethodExit) {
Description desc = (Description) method.getAnnotation(Description.class);
System.out.println(desc.value());
}
}
//or
for (Method method : methods) {
Annotation[] annotations = method.getAnnotations();
for (Annotation ann : annotations) {
if(ann instanceof Description){
Description d = (Description) ann;
System.out.println(d.value());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}