@Override 覆盖了父类的方法 ,重写
@Deprecated 标注 过时的方法。
@SuppressWarnings("deprecation"); 忽略deprecation的警告
Sping 的
@Autowired
@Service
@Repository
Mybatis的
@InsertProvider
@UpdateProvider
@Options
注解的分类
1。按照运行机制分
源码注解(注解实在源码中存在,编译成.class文件就不存在了)
编译时注解(注解在源码和.class文件中都存在。)
运行时注解(在运行阶段还起作用,甚至会影响运行逻辑的注解)
2。按照来源分
来自JDK的注解
来自第三方的注解
我们自己定义的注解
3。元注解(就是注解的注解)
自定义注解
1.自定义注解的语法要求
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description{
//使用@interface 关键字定义注解
//成员类型是受限的,合法的类型包括原始类型及String,Class,Annotation,Enumeration
//如果注解只有一个成员,则成员必须取名为value(),在使用时可以忽略成员名和赋值号(=)
//注解类可以没有成员,没有成员的注解称为标识注解
String desc();//成员以无参无异常方式声明
String author();
int age() default 18;//并且可以用default为成员指定一个默认值
}
2.注解的注解(元注解)
/*CONSTRUCTOR 构造方法声明
FIELD 字段声明
LOCAL_VARIABLE 局部变量声明
METHOD 方法声明
PACKAGE 包声明
PARAMETER 参数声明
TYPE 类,接口*/
@Target({ElementType.METHOD,ElementType.TYPE})
/*
SOURCE 只在源码显示,编译时丢弃
CLASS 编译时会记录到class中,运行时忽略
RUNTIME 运行时存在,可以通过反射读取
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited //表示类注解,允许子类继承
@Documented //生成javadoc时会包含注解
public @interface Description{
String desc();
String author();
int age() default 18;
}
3.使用自定义注解
使用注解的语法:
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,......)
@Description(desc="I am eyeColor",author="Mooc boy",age=18)
public String eyeColor(){
return "red";
}
//结合上面,这个注解@Description在eyeColor()方法上使用的。
4.解析注解
概念:通过反射获取类、函数或是成员上的"运行时"注解信息,从而实现动态控制程序运行的逻辑。
第一个类
package util;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) //注意这块参数RUNTIME 这是运行时可以解析参数,参照上面对应不同的类写不同的参数
@Inherited //表示类注解,允许子类继承,注意 接口是无效的。
@Documented
public @interface Description{
//使用@interface 关键字定义注解
//成员类型是受限的,合法的类型包括原始类型及 String,Class,Annotation,Enumeration
//如果注解只有一个成员,则成员必须取名为value(),在使用时可以忽略成员名和赋值号(=)
//注解类可以没有成员,没有成员的注解称为标识注解
/*String desc();//成员必须以无参无异常方式声明 ,否则语法错误,而且类型只能是合法的类型包括原始类型及String,Class,Annotation,Enumeration
String author();
int age() default 18;//并且可以用default为成员指定一个默认值*/
String value();
}
第二个类
package util;
@Description("I am annotation")
public class Child {
@Description("I am method")
public String name(){
return null;
}
}
第三个类
package util;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Iterator;
public class ParseAnn {
public static void main(String[] args) {
try {
//1.使用类加载器加载类
Class c=Class.forName("util.Child");
//2.找到类上面的注解
boolean isExist=c.isAnnotationPresent(Description.class);
if(isExist){
//3.拿到注解实例
Description d=(Description)c.getAnnotation(Description.class);
System.out.println(d.value());
}
//4.找到方法上的注解
Method[] ms=c.getMethods();
for (Method method : ms) {
boolean isMExist=method.isAnnotationPresent(Description.class);
if(isMExist){
Description d=method.getAnnotation(Description.class);
System.out.println(d.value());
}
}
//另外一种解析方法
for (Method method : ms) {
Annotation[] as=method.getAnnotations();
for (Annotation annotation : as) {
if(annotation instanceof Description){
Description d=(Description) annotation;
System.out.println(d.value());
}
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}