Java语言进阶-注解

什么是注解

从JDK5.0之后,Java增加了对元数据的支持,也就是Annotation。

注解其实就是代码里的特殊标记,这些标记可以在编译,加载,运行时被读取,并执行相应的处理。通过注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

注解可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在注解的name=value对中。

未来的开发模式基本就是基于注解,可以说框架=注解+反射+设计模式。

在使用注解时要在其前面增加@符号,并把注解当做一个修饰符来使用,用来修饰它支持的程序元素。

常见的注解实例

  • @auther:标明开发该类模块的作者,多个作者之间使用,分割。

  • @version:表明该类模块的版本

  • @see:参考转向,也就是相关主题

  • @since:从哪个版本开始增加的

  • @param:对方法中某参数的说明,如果没有参数就不能写。可以由多个,格式为:形参名 形参类型 形参说明

  • @return:对方法中返回值的说明,如果返回值类型是void就不能写。格式为:返回值类型 返回值说明

  • @exception:对方法中可能抛出异常进行说明,如果方法没有用throws显式抛出异常就不能写。可以由多个,格式为:异常类型 异常说明

  • @Override:限定重写父类方法,该注解只能用于方法

  • @Deprecated:用于表示所修饰的元素(类,方法)已过时。通常是因为所修饰的构造危险或存在更好的选择

  • @SuppressWarnings:抑制编译器警告

package com.annotation;

/**
 * @author han
 * @version 1.0
 * @see com.anntation
 * @since 
 */
public class AnnotationTest {

}

class Person {
    @SuppressWarnings("unused")
    private String name;

    @SuppressWarnings("unused")
    private int age;

    public Person() {
    }

    public Person(final String name, final int age) {
        this.name = name;
        this.age = age;
    }
    
    public void walk(){
        System.out.println("人走路");
    }

    public void eat(){
        System.out.println("人吃饭");
    }

    @Deprecated
    public void date(){
        System.out.println("几点啦");
    }
}

class Student extends Person{
    @Override
    public void walk() {
        System.out.println("学生走路");
    }    

    /**
     * @param str string 传入窝窝头
     * @return string 窝窝头,一块钱四个,嘿嘿 
     * @throws Exception 
     */
    public String eat(String str) throws Exception{
        str = str + ",一块钱四个,嘿嘿";
        return str;
    }
}

自定义注解

想要自定义注解,就得先看看jdk中注解是怎么定义的,先看一下@Override

package java.lang;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

可以看到他在定义的时候,使用了一个关键字:@interface

自定义注解还有以下特点:

  • 自定义注解自动继承java.lang.annotation.Annotation接口
  • 成员变量以无参形式声明。但是其方法名与返回值类型定义了该成员的名字与类型。类型包含八种基础数据类型与class类,enum类,annotation类所有类型的数组。
  • 可以为其成员变量指定初始值,但是必须以default声明。
  • 如果只有一个参数,建议使用value。
  • 如果定义的注解中有配置参数,那么使用的时候必须指定参数值,除非有默认值。格式为"参数名=参数值"。
  • 如果只有一个参数成员,可以忽略"value="
  • 没有成员变量的注解被称为标记,有成员变量的注解被称为元数据注解
package com.annotation;

/**
 * @author han
 */
public @interface MyAnnotation {
    String value() default "hello";
}

----------

package com.annotation;

@MyAnnotation("hi")
public class Cs {
    
}

元注解

元数据是修饰数据的数据,元注解就是修饰注解的注解。

JDK5.0提供了4个元注解,分别是:

  • Retention

    用来指定该注解的声明周期,使用此元注解必须为value成员变量指定值:

    • RetentionPolicy.SOURCE:在源文件中有效,会被编译器抛弃
    • RetentionPolicy.SOURCE:在class文件中有效,在运行时不加载,默认值
    • RetentionPolicy.RUNTIME:在运行时有效,可以通过反射读取
package com.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * @author han
 */

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "hello";
    
}
  • Target

    用来指定该注解能够修改哪些程序元素:

    • TYPE :类,接口,枚举类
    • FIELD:属性
    • METHOD:方法
    • PARAMETER:形参
    • CONSTRUCTOR:构造器
    • LOCAL_VARIABLE:局部变量
package com.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

/**
 * @author han
 */

@Target(ElementType.TYPE)
public @interface MyAnnotation {
    String value() default "hello";
    
}
  • Documented

    表示所修饰的注解在被javadoc解析时,保留下来

  • Inherited

    被他修饰的Annotation将具有继承性。其子类将拥有被Inherited修饰过的注解的功能。

JDK8中注解的新特性

  • 可重复注解

    如果想要对一个注解重复使用两次,可以将value改为一个数组。

    package com.annotation;
    
    /**
     * @author han
     */
    @Repeatable(MyAnnotation.class)
    public @interface MyAnnotation {
        MyAnnotation[] value();
    }
    
    ----------
    
    package com.annotation;
    
    @MyAnnotation(value = "hi")
    @MyAnnotation(value = "java")
    public class Cs {
        
    }
    

Java小白修炼手册

  • 类型注解

    ElementType.TYPE_PARAMETER 表示该注解可以写在类型变量的声明语句中

    ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值