编写注解
-
定义
-
四类原注解
-
@Retention
SOURCE:源码注解,只在源码中存在,编译成.class文件就不存在了
CLASS:编译时注解,注解在字节码文件级别可见,在源码和.class文件中都存在
RUNTIME:运行时注解,注解在整个运行阶段都可见
-
@Target 代表注解修饰的范围:类上使用,方法上使用,字段上使用
CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCAL VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口)
-
@Documented
生成javadoc时会包含注解
-
@Inherited
一个标识性的元注解,它允许子注解继承它
-
-
关键字@interface
-
属性 返回值类型 属性名() [default 默认值]
- 返回值类型:基本类型,String,Class,注解,枚举以及以上类型的一维数组
- 如果属性的名字是value,并且注解的属性值有一个 那么在使用注解时可以省略value
-
-
使用
- 注解可以没有属性,如果有属性需要使用小括号括住,例如
@Annotation
或@Annotation(key=value)
- 属性格式:属性名=属性值,多个属性用逗号隔开
- 如果属性名为value,且当前只有一个属性,value可以忽略
- 使用多个属性时,key的值为value不可省略
- 如果属性类型为数组,设置内容格式为:{1,2,3},例如
attrs={a,b}
- 如果属性类型为数组,值只有一个,{}可以忽略,例如
attres=a
- 一个对象上,注解只能使用一次,不能重复
- 注解可以没有属性,如果有属性需要使用小括号括住,例如
-
解析
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Desc { String value() default "helloword"; }
@Desc("这是一个类,创建人员对象") public class Persion { @Desc("这是一个属性,描述人名") private String name; public String getName() { return name; } @Desc("这是一个方法用来设置用户名") public void setName(String name) { this.name = name; } }
@WebServlet(name = "AnnotationServlet") public class AnnotationServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Class clazz = Class.forName("com.learn.annotation.Persion"); if (clazz.isAnnotationPresent(Desc.class)) { Desc desc = (Desc) clazz.getAnnotation(Desc.class); System.out.println(desc.value()); } Field field = clazz.getDeclaredField("name"); //setAccessible if (field.isAnnotationPresent(Desc.class)) { Desc desc = (Desc) field.getAnnotation(Desc.class); System.out.println(desc.value()); } Method method = clazz.getMethod("setName", String.class); if (method.isAnnotationPresent(Desc.class)) { Desc desc = (Desc) method.getAnnotation(Desc.class); System.out.println(desc.value()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } }
输出:
这是一个类,创建人员对象
这是一个属性,描述人名
这是一个方法用来设置用户名
网友评论