java深度学习_java深度学习——注解

Java的Annotation在日常开发,特别是java web开发中使用广泛,各种web框架,测试框架多多少少都会引入一些注解。若对java注解有一个全面深入的了解,对于我们的开发工作会有很大的帮助。

Annotation的功能

Annotation是作用于java程序元数据的特殊类型。本身和程序的逻辑隔离,程序的运行逻辑不会被Annotation影响。因此,Annotation在程序中的作用仅限于提供一种信息,定义Annotaiton时即把这种信息和被Annotation修饰的class,method,package等关联了起来。感兴趣的外部程序(如编译器,运行时检查系统,框架,工具等)即可通过反射机制从被修饰类型上获取到关联的Annotation,从而实现特殊的功能。因此可以说Annotaion是一种特殊的注释,是给框架,编译器,运行时检查系统等外部系统看的注释。

Anntation可以在运行时使用,也可以在编译时使用。在运行时,Annotation是class类的一部分,获取Annotation信息需要通过Class对象。而在编译期使用注解则需要特殊的工具,本文不讨论。

定义Annotation

Annotation是java中一种独立的类型,用@interface声明,且继承了Annotation接口。定义一个Annotation的目的无非是想注明一个类,一个field,乃至一个package拥有某项信息。因此Anntation的定义是非常轻量的,唯一要做的也只是定义在@interface体中定义一些name value对,定义形式类似于没有方法体的方法。这些name可以有默认值也可以没有默认值。Annotation的域可以使用8种基本类型和class,Enum等类型,例如下面代码所示:

@interface TestAnnotation{

public String testNmae();

public String testNameValue() default "test";

public int testIntName() default 10;

}

此外,Annotation定义时需要采用一些元注解来指定注解的属性,这些元注解作用于自定义注解,指定了自定义注解的可见范围,作用对象,是否可继承等属性,具体可见https://docs.oracle.com/javas...。

@Retention

@Target

@Documented

@Inherited

@Repeatable

使用Annotation

Annotation的使用包括在编译时使用和运行时使用,编译时使用需要Annotation工具,此文不讨论,在运行时使用需要用反射方法去获取注解信息,然后根据获取到的注解信息做自定义的处理。

处理Anntation和反射应用一样。首先获取需要处理的类或者方法等的Class对象,再用isAnnotationPresent方法检测指定的Anntation类型是否注解了该类,也可以用Class对象的getAnnotation方法获取到指定的Anntation对象。

代码清单1.1是一个简单的Annotation使用示例。

//1.1

// Description.java

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

@Documented

public @interface Description{

String value();

}

//AnnotationTest.java

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

@Documented

public @interface AnnotationTest{

String name();

}

//ClassWithAnnotation.java

@Description("this is a class with description annotation")

public class ClassWithAnnotation {

@AnnotationTest(name="this is a method with annotation")

public void doSth(){

System.out.println("i have a annotation");

}

}

//AnalysisAnnotation .java

public class AnalysisAnnotation {

public static void main(String[] args){

try{

Class> rtClass = Class.forName("annotation.ClassWithAnnotation");

Method[] methods = rtClass.getMethods();

boolean desctionExist = rtClass.isAnnotationPresent(Description.class);

if(desctionExist){

Description description = rtClass.getAnnotation(Description.class);

System.out.println("class's annotation value:"+description.value());

for(Method method:methods){

if(method.isAnnotationPresent(AnnotationTest.class)){

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

System.out.println("method's anntation value:"+annotation.name());

}

}

}

}

catch(ClassNotFoundException e){

e.printStackTrace();

}

}

}

9b2a661e704c44f14b38e94ecb32356a.png

运行结果如上。可以看到通过AnalysisAnnotation类中的反射方法获取到了ClassWithAnnotation这个类的注解以及其方法的注解。编译时代码即可这样获取到注解信息,加以利用。运行时注解的一个常见例子是junit等测试框架,或根据注解来实现一些功能。

除了运行时可以使用注解,在编译时也可以用注解,这个需要特殊的工具支持。常用来自动生成代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值