您的位置:首页 > 编程语言 > Java开发

《菜鸟反攻战》第一章----java注解

2017-07-13 21:10 337 查看

《菜鸟反攻战》第一章----java注解

一、什么是注解?为什么使用注解?

          元数据:用来描述数据的数据,具体指代的就是代码间的关系、或者代码与其他资源(比如数据库表)之间内在联系的数据,java注解就是元数据,在以前的版本中描述数据是使用xml文件进行描述,代码与描述文件耦合性较低,不利于维护,于是程序员就开始使用注解来对源代码进行注释。

        java注解在运行时有专门的工具进行处理,其存在不影响源代码的编译,去除注解后代码可以正常运行。

二、java注解的分类

     1、根据使用方法分为:
         JAVA内置注解:即JDK已经定义好的注解,在使用时具有特定的含义,比如@Override用于表示子类重写父类的方法;
         自定义注解:程序员自己通过元注解(后面讲解)来定义的为特定功能显示使用的注解,即DIY注解。

    2、根据成员变量个数分为:
        标记注解:定义的注解中没有成员变量(参数):
             public @interface Test{}//定义此注解时省略了元注解,这个语句定义了注解@Test,注解内部没有任何参数,即为标记注解
       元数据注解:注解内部包含成员变量(参数):
             public @interface Test{//定义注解时省略了元注解
                    public String value() default "";//注解内部的方法就是注解的参数,该注解定义时含有参数,即为元数据注解
             }

三、注解说明

     1、注解用于修饰源代码,不会影响源代码的编译及运行,去掉注解对源代码的运行没有影响,注解可以提供源代码的检查,比如@Override注解标注一个方法时,如果该类没有重写父类的该类或者父类中不存在该类,系统编译时会报错,这只是为代码的编译运行提供高效,并不是影响代码的作用,去除该注解后,源代码进行编译同样会报错(注解是提供程序员快速找到错误的原因并进行修复的功能)。
    2、注解内部均是以方法形式存在,一个方法就代表一个参数,也可以定义无参注解,当注解内部只有一个参数,且该参数的名称为value时,使用注解进行赋值可以省略参数名,例如自定义一个参数:
     public @interface Test{//定义注解时省略了元注解
       public String value() default "";//该注解只含有一个参数,且该参数的名称为value
    }

在使用该参数时可以省略省略参数名:
    @Test(value="aa") //此语句相当于@Test("a"),可以省略参数名
    public void info(){}        
   

    3、定义注解时可以使用default来对数据进行初始化,在使用时如果没有对参数进行赋值,系统将会使用定义注解时初始化的值。

   4、注解本身没有进行任何的逻辑处理,而是通过反射调用逻辑处理类,扫描含有该注解的内容,进行逻辑处理。

四、注解的运行原理

   1、定义注解
   2、在源代码中使用该注解
   3、jvm通过API反射,获取注解标注的属性值,并进行逻辑处理


五、JAVA内置注解

      java内置注解使用比较多的有三个:
    @Override:指定子类必须重写父类方法,当子类没有重写父类方法、方法名与父类不相同、父类没有该方法时均会报错:
        例如:
        //定义一个父类
         class Father{
               public void info(){
System.out.println("我是父类的方法");
                }
         }

      //定义一个子类继承Father类
        public class Sun  extends Father{
  @Override
public void info(){//如果该方法没有重写父类的方法或者方法名输入错误,系统会显示错误
System.out.println("我是子类,我重写了父类的方法");
  }
        }

    @Deprecated 标记该方法已经过时,不建议使用,如果标记过的方法在代码中被使用,系统会出现警告:
           //在一个类中定义了该方法不建议使用
         public classTest{
               @Deprecated
public void info(){}
                public static void main(String[] args){
                         new Test().info();//info方法标记过时,在主方法中使用标记的方法,系统会出现警告
}
  }
    
     @SuppressWarnings:取消系统的警告,参数不一一列举
          @SuppressWarnings(value="unchecked")
          public class Test{
int a=(int)22.3;//标注之后系统会取消警告信息
}

六、自定义注解

      元注解:定义注解的注解,要自定义注解时通过元注解来对注解进行描述
         1、@Target:用于描述注解的使用范围:
             (ElementType)有:
                1)CONSTRUCTOR:用于描述构造器
     2)FIELD:用于描述域(类的成员变量)
    3)LOCAL_VARIABLE:用于描述局部变量
4)METHOD:用于描述方法
5)PACKAGE:用于描述包
6)PARAMETER:用于描述参数
7)TYPE:用于描述类、接口(包括注解类型)或枚举声明

        2、@Retention:表示需要在什么级别保存该注解信息,描述注解的生命周期
                (RetentionPolicy)有:
               1)SOURCE:在源文件中有效
2)CLASS:在class文件中有效
3)RUNTIME:在运行时有效,注解处理器可以通过反射获取到注解的属性进行逻辑处理,使用比较广泛

3、@Documented:描述此注解是否可以在javadoc命令下形成doc文档

4、@Inherited:描述该注解具有继承性,使用该注解的类的子类也自动使用该注解

      例子:
           //定义注解类
package Annotation;

import java.lang.annotation.*;
/**
* 定义一个自定义注解,该注解用于标注颜色
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
public String color() default "";
}


//定义注解使用类

package Annotation;
public class MainTest {

@Test(color="red")
private String color;
public String getColor(){
return color;
}

public void setColor(String color){
this.color=color;
}
}


//注解处理器

package Annotation;
import java.lang.reflect.*;
public class AnnotationInfo {
public static void getInfo(Class<?> clazz){
String nn="颜色为:";
Field[] field=clazz.getDeclaredFields();
for(Field fields:field){
Test color=(Test)fields.getAnnotation(Test.class);
nn=nn+color.color().toString();
System.out.println(nn);
}
}
}


//运行注解

package Annotation;
public class AnnotationRun {
public static void main(String[] args){
AnnotationInfo.getInfo(MainTest.class);
}
}


运行结果为:


所有的内容是本菜鸟通过查阅网上资料及查看相关书籍,顺带加上自己那不成熟的理解,希望给自己做一个记录,同时希望可以一点一点慢慢开始理解更深刻,弥补现在的不足。
    

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: