专业的JAVA编程教程与资源

网站首页 > java教程 正文

JAVA注解(java注解deprecated)

temp10 2024-09-21 04:02:18 java教程 9 ℃ 0 评论

注解的定义

注解是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符

JAVA注解(java注解deprecated)

注解的作用

生成文档。这是最常见的,也是java 最早提供的注解。

常用的有@see @param @return

跟踪代码依赖性,实现替代配置文件功能。

在编译时进行格式检查。

如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

注解的分类

  • 标准注解 包括 Override, Deprecated, SuppressWarnings,标准注解是指 Java 自带的几个注解,上面三个分别表示重写函数,函数已经被禁止使用,忽略某项 Warning
  • 元注解 (注解的注解)

@Retention, @Target, @Inherited, @Documented,元注解是指用来定义注解的注解

@Target说明了Annotation所修饰的对象范围

Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标

作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

 取值(ElementType)有:

    1.CONSTRUCTOR:用于描述构造器

    2.FIELD:用于描述域

    3.LOCAL_VARIABLE:用于描述局部变量

    4.METHOD:用于描述方法

    5.PACKAGE:用于描述包

    6.PARAMETER:用于描述参数

    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

  使用实例:  

@Target(ElementType.TYPE)

public @interface Table {

/**

* 数据表名称注解,默认值为类名称

* @return

*/

public String tableName() default "className";

}

@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)

    2.CLASS:在class文件中有效(即class保留)

    3.RUNTIME:在运行时有效(即运行时保留)

  Retention meta-annotation类型有唯一的value作为成员,

它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。

具体实例如下:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Column {

public String name() default "fieldName";

public String setFuncName() default "setField";

public String getFuncName() default "getField";

public boolean defaultDBValue() default false;

}   

Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共AP I,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Column {

public String name() default "fieldName";

public String setFuncName() default "setField";

public String getFuncName() default "getField";

public boolean defaultDBValue() default false;

}

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

@Inherited

public @interface Greeting {

public enum FontColor { BULE,RED,GREEN};

String name();

FontColor fontColor() default FontColor.GREEN;

}

  • 自定义注解

自定义注解表示自己根据需要定义的注解,定义时需要用到上面的元注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

  定义注解格式:

  public @interface 注解名 {定义体}

  注解参数的可支持数据类型:

    1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)

    2.String类型

    3.Class类型

    4.enum类型

    5.Annotation类型

    6.以上所有类型的数组

  Annotation类型里面的参数该怎么设定:

  第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   

  第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  

  第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

以下自定义一个Test注解,含有两个元素 id 和 description

mport java.lang.annotation.Documented;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.Target;

import java.lang.annotation.ElementType;

import java.lang.annotation.RetentionPolicy;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

/*

* 定义注解 Test

* 注解中含有两个元素 id 和 description

* description 元素 有默认值 "no description"

*/

public @interface Test {

public int id();

public String description() default "no description";

}

使用上面自定义的Test注解

import java.lang.reflect.Method;

public class TestAnnotation {

@Test(id = 1, description = "hello method_1")

public void method_1() {

}

@Test(id = 2)

public void method_2() {

}

@Test(id = 3, description = "last method")

public void method_3() {

}

// 解析注解,将TestAnnotation类 所有被注解方法 的信息打印出来

public static void main(String[] args) {

Method[] methods = TestAnnotation.class.getDeclaredMethods();

for (Method method : methods) {

boolean hasAnnotation = method.isAnnotationPresent(Test.class);

// 判断方法中是否有指定注解类型的注解

if (hasAnnotation) {

// 根据注解类型返回方法的指定类型注解

Test annotation = method.getAnnotation(Test.class);

System.out.println("Test( method = " + method.getName() + " ,

id = " + annotation.id() + " , description = "+ annotation.description() + " )");

}

}

}

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表