java中的注解(Annotation)仍是要知道一些滴

认识注解

注解的初识在自动生成重写诸如equals()等方法时头顶的那个@Override,还有消除那黄黄的警告线时的@SuppressWarnings,当时只是感受无关紧要的东西,对它就像只是看待一个不知道哪儿定义的一个方法而已。java

以后感受它的神奇就是在项目使用框架时了。学习框架时用的xml配置,已经感受挺有创意了,并无学习annotation,在一次实际项目开发中,hibernate,spring,springMVC统统注解。那简洁的xml配置和一行代码顶数句的注解更是感到神气的不行(xml与注解各有好处,非是误导注解必定强于xml),而后才对注解另眼相看,准备多学习一些。spring


我的信息
注解出生时间在jdk 1.5版本。地位呢,他是一个类型,地位同于class(类),interface(接口),固然还有一个平级可是和它同样不是很是常见的类型:enmu(枚举)。数据库

项目经历
Hibernate中,用注解能够实现字段与数据库列的映射。api

Spring中注解更是用着舒服,不管是Io仍是AOP的配置,使用注解效率比起xml配置都是快捷不少。并且也是在框架学习时较多的使用注解,发现注解的强大。也由此以为再使用的基础上应该有一些进一步的了解。数组

其余框架中如Junit 4版本开始后也是注解@Test代替了命名规则,数不胜数,相信在以后开发中,注解会被越来多的使用。框架

技能分类ide

注解有三种类型工具

  1. 自定义注解:顾名思义,就是本身写的注解了,具体的实如今以后说明。
  2. 内置注解: 也就是jdk中本身定义的注解,如以前所说@Override等都是。
  3. 元注解: 能够注解在注解上的注解(看起来有点绕口,不错~)
package java.lang;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

如上代码,这是源码中的@Override代码,这个其实就是个自定义注解(我的想法),只不过是jdk本身写的,因此他就是内置注解
其中有两行学习

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)

这儿的@Target@Retention就是元注解。固然不止这两个。测试

  1. Documented 指示某一类型的注释将经过 javadoc 和相似的默认工具进行文档化。
  2. Inherited 指示注释类型被自动继承。
  3. Retention 指示注释类型的注释要保留多久。
  4. Target 指示注释类型所适用的程序元素的种类。

具体的定义以及参数的解释在API文档或者源码【帮您找好】中java.lang.annotation包均可以很明确的了解。包括内置注解均可以直接看jdk中的具体实现。

实践

在文档或jdk中元注解以及内置注解自定义都有源码参考,所以再须要了解的即是自定义注解。

自定义注解有三个:

  1. 定义一个注解。在源码中和平时不同的就是那个@interface,他于注解就至关于class于一个类,用@interface声明要定义的是一个注解,后面跟的天然是注解名称了。
  2. 应用一个注解。注解定义后,根据定义的适用范围(类,方法,字段等等)使用注解。注解不会直接影响原有代码,无论运行仍是什么的
  3. 处理注解。在2中说注解不会影响代码,也许会想到不影响那怎么注入了,验证了等等。注解不会影响,可是处理注解就影响了。注解至关于给墙上打了个‘拆’字,这个不会对房子有任何损坏(别说影响美观~),可是挖掘机看见‘拆’字就会扑上去,这就不能保证房子的安然了。这儿对注解(能保留到运行期)的处理通常经过java中的反射机制来实现。

注解参数类型:

  1. 全部基本数据类型(int,float,boolean,byte,double,char,long,short)
  2. String、Class、enum、Annotation类型
  3. 以上全部类型的数组

举个栗子:

//1. 定义两个注解 StuId(用来讲明学号)    StuSex(用来定义性别)

@Target(ElementType.FIELD)//做用于字段上
@Retention(RetentionPolicy.RUNTIME)//保留到运行期
public @interface StuId{
    /**此处定义成员也就是用注解时要传递的相似于参数的玩意,指定了默认值,使用时能够不写字段值
    *不然必须写:如 @StuId(stuId = "0001") 
    *若是是单一属性 通常声明为 String value(); 
    *这样在使用时能够简写为 @StuId("0001")
    */
    String stuId() default "000";//使用时能够 @StuId  字段值会取默认值000
    
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StuSex{
    public enum sex{
        男,女;
    }
    sex stuSex() default sex.男;
}

//2. 使用注解(房子写个"拆")
public class Student{
    
    //给字段注值应该在set方法上,字段上破坏了封装性,此处无视~
    
    @StuId(stuId = "0001")
    private String stuId;
    
    @StuSex(stuSex = sex.女)
    private String stuSex;
    
    //...省略getter和setter
}
//3. 处理注解(出动挖掘机...)
public static void getStuInfo(Class<?> clazz){
    Field[] fields = clazz.getDeclaredFields();
        
    for(Field field :fields){
        //找出其中是StuId类型的注解
        if(field.isAnnotationPresent(StuId.class)){
            StuId stuId = (StuId) field.getAnnotation(StuId.class);
            System.out.println("学号:"+stuId.stuId());
        }
        //找出其中是StuSex类型的注解
        else if(field.isAnnotationPresent(StuSex.class)){
            StuSex stuSex= (StuSex) field.getAnnotation(StuSex.class);
            System.out.println("性别:"+stuSex.stuSex());
        }
    }
}

//如上注解已经完成,下来测试:
public class Test {
    public static void main(String[] args) {
        DellStu.getStuInfo(Student.class);
    }
}

输出结果:
学号:0001
性别:女
//回看 2.注解使用 ,若是是这样,不写字段值
    @StuId(stuId = "0001")
    private String stuId;
    
    @StuSex(stuSex = sex.女)
    private String stuSex;
//那么输出结果(注解定义时设置的默认值):
学号:000
性别:男

我的评价 通常状况下是用不到本身去实现一个注解的,只有开发框架什么的大牛们才会用到(为了给我这菜鸟用...),可是仍是有必要简单了解一些。

相关文章
相关标签/搜索