Java注解介绍

什么是注解?

Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法
注解是在Java1.5版本提出的,目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,学习注解能够读懂别人写的代码,特别是框架相关的代码,让编程更加简洁,代码更加清晰。

Java中的常见注解:

1.按照来源分
JDK自带注解

@Override 如果想重写父类的方法,比如toString()方法的话,在方法前面加上@Override 系统可以帮你检查方法的正确性
@Deprecated 若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用
@SuppressWarnings 忽略指定警告

第三方注解

Spring中的 @Autowired @Service @Repository
Mybatis中的 @InsertProvider @UpdateProvider @Options

元注解

是指注解的注解,包括@Retention @Target @Document @Inherited四种
@Target({ElementType.METHOD,ElementType.TYPE}) 注解作用域
作用域列表:
CONSTRUCTOR 构造方法声明
FIELD 字段声明
LOCAL_VARIABLE 局部变量声明
METHOD 方法声明
PACKAGE 包声明
PARAMETER 参数声明
TYPE 类,接口
@Retention(RetentionPolicy.RUNTIME) 生命周期
类型:
SOURCE只在源码显示,编译时会丢弃
CLASS 编译时会记录到class中,运行时忽略
RUNTIME 运行时存在,可以通过反射读取
@Inherited 允许子类继承
@Documented 生成javadoc时会包含注解

自定义注解
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
//如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
//注解类可以没有成员,没有成员的注解称为标识注解
public @interface Description { //使用@interface关键字定义注解
    //成员类型是受限的,合法的类型包括原始类型及String,Class,Annotation,Enumeration
    String desc(); //成员以无参无异常方式声明
    String author();
    int age() default 18;//可以用default为成员指定一个默认值
}

使用自定义注解
语法:

@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
@Description(desc="I am eyeColor",author="Mooc boy",age=18)
public String eyeColor(){
    return "red";    
}
2.按照运行机制分

源码注解 :注解只在源码中存在,编译成.class文件就不存在了
编译时注解: 注解在源码和.class文件中都存在
运行时注解: 在运行阶段还起作用,甚至会影响运行逻辑的注解

解析注解

概念:通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
用法如下:

1.使用类加载器加载类

class c = Class.forName(“类的全限定名”);//传入string类型参数,要求jvm查找并加载指定的类,返回的是一个class对象的引用

2.找到类上面的注解

boolean isExist = c.isAnnotationPresent(Description.class);//如果指定类型的注解存在于此元素上,返回true,否则返回false

3.拿到注解实例

Description d = (Description)c.getAnnotation(Description.class);//指定注解类型返回在此元素上的注解(如果存在),否则返回null
或者c.getAnnotations();拿到全部的注解

4.找到方法上的注解

Method[] ms = c.getMethods();//返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法
for(Method m:ms){
boolean isExist = c.isAnnotationPresent(Description.class);
}

你可能感兴趣的:(Java)