您的位置:首页 > 其它

框架学习----注解的认识

2017-09-18 18:54 225 查看

注解的认识和理解

在学习框架的过程中我们经常会看到在类顶端有@+相应的描述,在定义了一个接口之后,在写实现类实现接口方法的时候我们会在方法的顶端看到@Override这样的字样,所有的这些都是注解相关的内容,本篇博客将和大家详细学习和了解下有关注解的内容。

常见的注解类型

在整个Java中我们常见的注解主要可以归纳为以下三种:

JDK注解

第三方注解

自定义注解

JDK注解

JDK注解是我们日常开发中最为常见的注解,主要有:@Override,@Deprecated,@SuppressWarnings。他们各自的功能:

1. @Override代表的是子类对父类方法进行了覆写,如果父类没有定义该方法,子类方法有该参数就会出现编译异常。

2. 使用了@Deprecated注解,意味着当前的方法或者类已经过时了,被弃用了,在引用的时候会报警告。

3. @SuppressWarnings该注解表示的是忽略某个警告通过在()中写入字符串,来确定忽略的警告类型

第三方注解

第三方注解一般出现在我们使用的框架上例如在使用Spring的时候我们会用到@AutoWired、@Service以及@Repository,MyBatis会用到@InsertProvider,@UpdateProvider以及@Options等。

自定义注解

自定义注解顾名思义就是我们为达到某种编程目的自定义的注解,在讲解自定义注解的时候我们首先需要了解的是元注解的用法:元注解的类型主要
4000
有@Target,@Retention,@Inherited,@Documented,是自定义注解用到的注解。这里分别说下各个元注解的意义和用法:

1. @Target该注解内部定义的是注解使用的对象,内部可以传入的参数主要有ElementType.CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCALVARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口)。

2. @Retention注解则用来确定该注解的的生命周期内部传的参数主要有三种:RetentionPolicy.SOURCE/CLASS/RUNTIME,其中SOURCE 代表的是该注解只在源码中显示在编译是丢弃,CLASS则是编译时记录到CLASS,运行时忽略,RUNTIME代表的是运行时有效可以通过反射读取。

3. @Inherited代表的是注解可继承,该注解不需要传参数,如果该注解最终用在了父类上,在获取该注解的时候我们可以通过向他的子类获取相应的属性值,JVM会自下向上去不断地寻找直到找到注解引用的类为止。

4. @Document则表示源代码在生成javadoc的过程中该注解是否也作为内容显示在代码的上方,有该注解则显示没有则不显示。

注解获取的方法

在谈注解获取的时候必须要说的就是反射的知识,这里我主要说两种获取的注解的方法以及详细流程:

1.类加载模式:

调用Class.forName()拿到类对象

根据注解适用位置获取相应的属性(ElementType的类型)

调用isAnnotationPresent方法判断是否使用注解

调用getAnnotation拿到注解

回调注解中的方法名拿到对应的数值

代码如下:

public static void main(String[] args){
try{
Class stuClass=Class.forName("com.hyt.service.IStuSelectImpl");
boolean isAnnotated=stuClass.isAnnotationPresent(ClassInfo.class);
if(isAnnotated){
ClassInfo classInfo=stuClass.getAnnotation(ClassInfo.class);
System.out.println("注解对应的信息是:"+classInfo.value());
}else{
System.out.println("该注解不存在");
}

}catch(ClassNotFoundException e){
e.printStackTrace();
}
}


2.带有泛型的类对象:

通过Class stuClass=MethodInfo.class;获取类对象

判断是否使用了定义好的注解

若使用了注解,获得该注解对应的实例

通过实例调用相关方法获取属性值

代码如下:

public static void main(String[] args){
Class<MethodInfo> methClass=MethodInfo.class;
boolean isAnnotated=methClass.isAnnotationPresent(MethodInfo.class);
if(isAnnotated){
MethodInfo methInfo=methClass.getAnnotation(MethodInfo.class);
System.out.println("方法名:"methInfo.name()+" 方法描述:"+methInfo.comments());
}else{
System.out.println("注解不存在");
}
}


总结:

学习注解的关键一方面要了解四种元注解各自的用法和代表的意思,另外一方面则是要知道获取注解的流程。当然学以致用,我们学习注解的主要目的还是为了在以后的编码过程中能够用的上这种注入数据的特殊方式,同时也有助于我们理解常用框架的编程思想和底层逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: