概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。
Java中的常见注解
JDK自带注解:
@Override//覆盖父类的方法
@Deprecated//表示方法过时了
@SuppressWarnings("deprecation")//忽略deprecation警告
常见第三方注解:
Spring : @Autowired @Service @Repository
Mybatis :@InsertProvider @UpdateProvider @Options
注解的分类
按照运行机制分:
1.源码注解:注解只在源码中存在,编译成.class文件就不存在了
2.编译时注解:注解在源码和.class文件中都存在(jdk自带注解)
3.运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解
按照来源分:
1.来自JDK的注解
2.来自第三方的注解
3.我们自己定义的注解
元注解:注解的注解
1 @Target({ElementType.METHOD,ElementType.TYPE})/**注解的作用域 2 //CONSTRUCTOR(构造方法声明)、FIELD(字段声明)、LOCAL_VARIABLE(局部变量声明) 3 //METHOD(方法声明)、PACKAGE(包声明)、TYPE(类、接口) 4 */ 5 @Retention(RetentionPolicy.RUNTIME) /** 6 //声明周期RUNTIME(运行时存在,可以通过反射读取)、 7 //CLASS(编译时会纪录到class中,运行时忽略)、 8 //SOURCE(只在源码显示,编译时会丢弃)*/ 9 @Inherited/**允许子类继承注解,对接口无效,对类有效;只继承类的注解,类下的方法的注解无法继承*/ 10 @Documented/**生成javadoc时包含注解*/ 11 public @interface Description{//使用@interface关键字定义注解 12 /** 13 * 成员以无参无异常方式声明 14 * 成员类型是受限的,合法的类型包括原始类型及String,Class,Annotation,Enumeration 15 * 可以用default为成员指定一个默认的值 16 * 如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=) 17 * 注解类可以没有成员,没有成员的注解称为标识注解 18 */ 19 // String desc(); 20 // String author(); 21 // int age() default 18; 22 String value(); 23 }
1 public interface Person { 2 public String name(); 3 @Deprecated 4 //表示方法过时了 5 public int age(); 6 }
1 @Description("i am class") 2 public class Child implements Person { 3 @Override 4 @Description("i am method") 5 public String name() { 6 return null; 7 } 8 @Override 9 public int age() { 10 return 0; 11 } 12 }
1 public class Test { 2 3 @SuppressWarnings({ "rawtypes", "unchecked" }) 4 public static void main(String[] args) { 5 try { 6 //1.使用类加载器加载类 7 Class c = Class.forName("com.wzyy.zujie.Child"); 8 //2.找到类上面的注解,判断这个类com.wzyy.zujie.Child上是否存在Description.class这个注解 9 boolean isExist = c.isAnnotationPresent(Description.class); 10 if(isExist){ 11 //3.拿到注解实例 12 Description d = (Description) c.getAnnotation(Description.class); 13 System.out.println(d.value());//i am class 14 } 15 //4.找到方法上的注解 16 Method[] ms = c.getMethods(); 17 for(Method m:ms){ 18 //第一种解析方法,判断这个方法上是否存在Description注解 19 // boolean isMExist = m.isAnnotationPresent(Description.class); 20 // if(isMExist){ 21 //存在就得到这个方法上的Description注解 22 // Description d = m.getAnnotation(Description.class); 23 // System.out.println(d.value());//i am method 24 // } 25 //第二种解析方法,得到这个方法上所有的注解,判断是否是Description 26 Annotation[] as =m.getAnnotations(); 27 for(Annotation a:as){ 28 if(a instanceof Description){ 29 Description d = (Description) a; 30 System.out.println(d.value());//i am method 31 } 32 33 } 34 } 35 36 } catch (ClassNotFoundException e) { 37 e.printStackTrace(); 38 } 39 40 } 41 // /**使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>....)*/ 42 // @Description(desc="aaa",author="bb",age=22) 43 // public String eyeColor(){ 44 // return "red"; 45 // } 46 }