EchoDemo's Blogs

Java中Annotation

1、Annotation简介

(1)Annotation是Java5开始引入的新特性。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据与程序元素(类、方法、成员变量等)进行关联。更通俗的意思就是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。Annotation像一种修饰符一样,应用于包、类、构造方法、方法、成员变量、参数及本地变量的声明语句中。按照运行机制划分包括源码注解、编译时注解和运行时注解;按照来源来划分的话包括JDK注解、第三方注解和自定义注解。

(2)Annotation的原理

1)Annotation其实是一种接口。通过Java反射机制中的相关API来访问annotation信息。相关类(框架或工具的类)根据这些信息来决定如何使用该程序元素或者改变他们的行为。Annotation是不会影响程序代码的执行的,无论Annotation怎么变化,代码都始终如一地执行。

2)Java语言解释器在工作时会忽略这些Annotation,因此在JVM中这些Annotation是“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。Annotation的工具统称APT(Annotation Processing Tool)。

2、常见的标准Annotation(也称之为JDK注解,它们属于编译时注解)

(1)@Override:@Override就是用来指定方法重写的,他可以强调一个子类必须要覆盖父类的方法。

(2)@Deprecated:@deprecated用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将会给出警告。

(3)@SuppressWarning:@SuppressWarning指示被Annotation标识的程序元素(以及在该程序元素中的所有子元素)取消显示指定的编译器警告。

(4)举例说明

1)@Override:可以防止方法名写错。

package com.iotek.annotation;

public class OVerrideDemo {

    public static void main(String[] args) {
        Apple apple = new Apple();
        apple.info();
    }
}

class Fruit{
    public void info(){
        System.out.println("描述水果的信息!");
    }
}

class Apple extends Fruit{
    @Override
    public void info() {
        System.out.println("我是苹果!");
    }
}

2)@Deprecated:提示程序员不推荐使用

package com.iotek.annotation;

public class DeprecatedDemo {

    public static void main(String[] args) {
        Person person = new Person();
        person.showInfo();
    }
}

class Person{
    @Deprecated
    public void showInfo(){
        System.out.println("hello person!");
    }
}

3)@Suppresswarning:去除警告信息

package com.iotek.annotation;

public class SuppresswarningDemo {

    public static void main(String[] args) {

    }
}

class Container<T>{
    private Object[] obj = null;
    public Container(){
        obj = new Object[10];
    }
    @SuppressWarnings("unchecked")
    public T[] toArray(){
        return (T[])obj;
    }
}

3、自定义Annotation

(1)语法

访问修饰符 @interface Annotation名称{
    返回类型 method() [默认值];
}

1)Annotation类型的方法必须声明为无参数、无异常抛出的。这些方法定义了Annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。方法的返回类型必须要为基本数据类型、String类型、Class类型、枚举类型、Annotation类型或者由前面类型之一作为元素的一维数组。

2)方法的后面可以使用default和一个默认数值来声明成员的默认值来声明成员的默认值,null不能作为成员的默认值。在定义Annotation型态时,不能继承其他的Annotation型态或是接口。

(2)举例说明

package com.iotek.annotation;

//可以修饰类
@MyAnnotation1
public class MyAnnotation {
    //可以修饰方法
    @MyAnnotation1
    @MyAnnotation3
    public static void main(String[] args) {
        //可以修饰成员变量,可以有多个注解
        @MyAnnotation1
        @MyAnnotation2(name="zhangsan")
        @MyAnnotation3("haha")
        @MyAnnotation4(sex="男",age=10)
        @MyAnnotation5({"haah","hehe","ee"})
        @MyAnnotation6(color=Color.RED)
        int number = 10;
    }
}

@interface MyAnnotation1{

}

@interface MyAnnotation2{
    String name();
}

@interface MyAnnotation3{//value和默认值
    String value() default "lisi";//只有为value时才可以省略"value=",有默认值时可以不给值。
}

@interface MyAnnotation4{//两个元素
    String sex();
    int age();
}

@interface MyAnnotation5{//数组
    String[] value();
}

enum Color{
    RED,BLUE,YELLOW;
}

@interface MyAnnotation6{//枚举类型
    Color color();
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------