美文网首页
java注解

java注解

作者: XShock | 来源:发表于2016-07-26 23:03 被阅读722次

    java注解用来描述java代码中的元信息,通常情况下,注解不会影响代码执行,尽管有些情况下,注解可以做到影响代码的执行。

    java注解在java5被添加进来,

    java注解的作用
    java注解通常被用来用作以下目的

    • 编译器指令
    • 构建时指令
    • 运行时指令

    java内置了三种编译器指令,本文后面会详细介绍。

    java注解可以应用于构建时,即当你构建你的项目时。构建的过程包括产生源代码、编译源代码、产生xml文件,将编译过的代码或文件打包进jar文件等等。软件的构建通常使用Apache Ant或者Apache Maven这样的工具自动完成。构建工具会扫描java代码里的注解,然后根据这些注解产生源代码或者其它的文件。

    通常情况下,注解不会出现在编译之后的java代码中,但是想要出现也是可以的。java支持运行时注解。这些注解可以通过java反射访问,运行时注解主要是提供给程序或者第三方API一些指令。


    注解基础

    一个简单的java注解类似于下面这种
    @Entity@符号告诉编译器这是一个注解,跟在@符号后面的是注解的名字。上述例子中注解的名字是Entity。

    注解元素

    java注解可以使用元素设置一些值。元素类似于属性或者参数。下面是一个包含元素注解的例子。

    @Entity(tableName = "vehicles")
    

    上述注解元素名称是tableName,值是vehicles,没有元素的注解不需要括号。注解可以包含多个元素,下面就是包含多个元素的例子。

    @Entity(tableName = "vehicles", primaryKey = "id")
    

    当注解只包含一个元素时,你可以省去写元素的名字,直接赋值即可。下面的例子就是直接赋值。

    @InsertNew("yes")
    

    注解使用

    注解可以在以下场合被使用到

    • 接口

    • 方法

    • 方法参数

    • 属性

    • 局部变量
      下面是一个完整使用注解的例子。

        @Entity
        public class Vehicle {
      
        @Persistent
        protected String vehicleName = null;
      
      
        @Getter
        public String getVehicleName() {
            return this.vehicleName;
        }
      
        public void setVehicleName(@Optional vehicleName) {
            this.vehicleName = vehicleName;
        }
      
        public List addVehicleNameToList(List names) {
      
            @Optional
            List localNames = names;
      
            if(localNames == null) {
                localNames = new ArrayList();
            }
            localNames.add(getVehicleName());
      
            return localNames;
        }
        }
      

    内置的java注解

    java有三种内置的注解,用来为编译器提供指令。

    • @Deprecated
    • @Override
    • @SuppressWarnings

    @Deprecated

    • 可以用来标记类、方法、属性
    • 如果上述三种元素不再使用可以用@Deprecated标记
    • 如果代码使用了@Deprecated注解的类,方法,或者属性,编译器会给出警告。

    @Deprecated注解使用很简单,以下是使用@Deprecated注解一个已经弃用的类。

    @Deprecated
    public class MyComponent {
        
    }
    

    当我们使用@Deprecated注解后,建议配合使用对应的@deprecated JavaDoc符号,并解释说明为什么这个类,方法或属性被弃用,已经替代方案是什么。例子如下:

        @Deprecated
        /**
          @deprecated Use MyNewComponent instead.
        */
        public class MyComponent {
        
        }
    

    @Override

    @Override注解用来标示重写父类中的方法,如果这个方法没有重写父类的方法,而添加这个注解,编译器会报错。实际上,在子类中重写父类或者接口中的方法,@Override并不是必须的。但是,仍然建议你使用这个注解。假设你修改了父类的方法的名字,那么之前重写的子类方法将不再属于重写,如果没有@Overide,你将不会察觉到这个子类的方法。有了这个注解修饰,编译器则会提示你这些信息。

    使用@Override的例子如下。

        public class MySuperClass {
    
        public void doTheThing() {
            System.out.println("Do the thing");
        }
        }
    
    
        public class MySubClass extends MySuperClass{
    
        @Override
        public void doTheThing() {
            System.out.println("Do it differently");
             }
        }
        
     ___
    

    @SuppressWarnings

    • @SuppressWarning用来抑制编译生成警告信息
    • 可以修饰的元素为类,方法,方法参数,属性,局部变量

    当一个方法调用了一个被弃用的方法或者是不安全的类型转换,编译器就会产生警告,你可以使用@SuppressWarnings抑制编译器产生警告。

    使用示例如下

        @SuppressWarnings
        public void methodWithWarning() {
        
        }
    

    创建自己的注解

    可以定义自己的注解,和类或者接口一样,注解可以定义在自己的文件中。

    使用自定义注解如下

        @interface MyAnnotation {
             String   value();
            String   name();
            int      age();
            String[] newNames();
        }
    

    上述例子定义了一个叫MyAnnotation的注解,它有四个元素。@interface告诉编译器这是一个注解。

    每个元素的定义与接口中的方法定义类似,它有数据类型和名字。这些类型可以是

    • 原始数据类型

    • String

    • Class

    • annotation

    • 枚举

    • 一维数组

      以下示例为应用自定义注解

        @MyAnnotation(
            value="123",
            name="Jakob",
            age=37,
            newNames={"Jenkov", "Peterson"}
        )
        public class MyClass {
        
        }
      

      注意我们需要为所有元素设置值一个都不能少

      元素的默认值

      对于元素中的注解,我们可以为其设置默认值,使用方法为

        @interface MyAnnotation {
      
            String   value() default "";
            String   name();
            int      age();
            String[] newNames();
        
        }
      

      上述注解中我们设置value的值为空字符串,那么我们在使用此注解时,可以不设置value的值,即让value使用设置的空字符串的默认值。示例如下

        @MyAnnotation(
            name="Jakob",
            age=37,
            newNames={"Jenkov", "Peterson"}
        )
        public class MyClass {
        
        }
      

      @Retention

      @Retention用来修饰注解的注解,使用这个注解,我们可以做到

    相关文章

      网友评论

          本文标题:java注解

          本文链接:https://www.haomeiwen.com/subject/avqojttx.html