jdk自带注解
@Override 覆盖父类的方法
@Deprecated 注解一个方法 表示该方法过时了
@Suppvisewarnings @SupressWarnings("deprecation")//忽略警告
常见第三方注解
Spring:
@Autowired 自动生成一个类的实例
@Service
@Repository
Mybatis:
@InsertProvider
@UpdateProvider
@Options
注解的分类
运行机制化分
源码注解 注解只在源码中出现 class文件就没有了
编译注解 在源码和.class 文件中都存在
运行注解 运行阶段起作用 影响程序的运行逻辑
来源来分
jdk注解
第三方的注解
自定义的注解
元注解 注解的注解
自定义注解
语法要求
元注解
@Target(ElementType.METHOD,ElementType.TYPE) //注解的作用域 可以用在 CONSTRUCTOR构造方法声明 FIELD字段声明 LOCAL_VARIABLE局部变量 METHOD方法声明 PACKAGE包声明 PARAMETER参数声明 TYPE类接口
@Retention(RetentionPolicy.RUNTIME) 生命周期SOURCE 在源码时显示 编译被丢弃 CLASS 编译时记录到class中,运行时忽略 RUNTIME 运行时存在,可以通过反射获取
@Inherited 允许子类继承 继承只会继承类上面的注解 不会继承方法上的注解
@Documented 生成javadoc包含注解信息
public @interface Description{
String desc();
String author();
int age() default 18;
}
使用@interface关键字定义注解
成员以无参无异常方式声明
可以用defalut成员指定默认值
成员类型包括原始类型 以及String class Annotation Enumeration
如果注解只有一个成员,则成员名必须取名为value() ,在使用时可以忽略成员名和赋值号=
注解类可以没有成员 成为标识注解
使用注解
@Description(desc="gac",autor="gac1",age=18)
public String eyeColor(){
return "red";
}
解析注解
通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
public class ParseAnn{
//使用类加载器加载类 获得类上的注解
try{
Class c = Class.forName("com.ann.test.Child");//这个类使用了定义的注解
//2.找到类上面的注解
boolean isExists = c.isAnnotationPresent(Description.class);
if(isExits){
//拿到注解实例
Description d = (Description)c.getAnnotation(Description.class);
System.out.println(d.value());
}
//找到方法上的注解
Method[] ms = c.getMethods();
for(Method m:ms){
boolean isMExits = m.isAnnotationPresent(Description.class);
if(isMExits){
Description d = (Description)m.getAnnotation(Description.class);
System.out.println(d.value());
}
}
//另外一种解析方法
for(Method m : ms){
Annotation[] as = m.getAnnotations();
for(Annotation a:as){
if(a instanceof Description){
Description d = (Description)a;
System.out.println(d.value());
}
}
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。