java之注解的定义和使用

简介: java之注解的定义和使用

初识注解:

注解的概念:

注解是从JDK5.0开始引入的新技术,它不是程序本身,但是和注释有相同的作用,都能够对程序做出一定的解释,并且注解能够被其他编译器所读取


注解的格式:

注解是以“@注释名”开头在代码中存在的,有些特殊的注解还会存在数值等信息

例如我们最常见的如下所示的----重写的注解:

注解的使用场景:

可以附加在package,class,method,field等上面,相当于为它们添加了额外的辅助信息,可通过反射机制编程实现对这些元数据的访问。

注解的作用:

在某些时候能够起到检查和约束性的行为,举例:

当我们将“hashcode”错写成了“HashCode”,程序就会报错,以便于我们及时的进行修改

常见的内置注解:

Override:

查看API文档

对于下述方法,如果不加“@override”,程序也可以正常的运行,但是如果加上“@override”,那么就一定要重写或者实现在超类型中声明的方法,并且方法名不允许任意的修改。

 @Override
        public String toString() {
            return "Book [id=" + id + ", name=" + name + ", num=" + num
                    + ", price=" + price + ", money=" + money + ", publish="
                    + publish + "]";
        }
Deprecated:

举例:

如下方法的注解为:“Deprecated”:

package Collections;
public class reflect {
 @Deprecated
    public static  void show(){
     System.out.println("Deprecated");
 }
 public static void main(String[]args){
    show();
 }
}

输出:

Deprecated

虽然程序能够正常的输出结果,但是在调用该方法的时候,出现了如下所示的情况,这就表明编译器不鼓励使用该程序元素。

SuppressWarnings:

举例:

在上述代码中,我们定义了变量a,但并未使用它,因此编译器会报出警告,

要想“镇压“”这种警告,我们就可以在程序中添加 @SuppressWarnings("all")

此时变量a不仅变成了普通的黑色,且点击它并未有任何的警告。


但是,“镇压”警告并不是我们所提倡的,因为警告往往能够帮助我们发现代码书写中的错误,以便于我们进行检查。

元注解:

元注解的作用就是负责注解其他注解,java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明

这些类型和他们所支持的类型在java.lang.annotation包中可以找到

(@Target,@Retention@Documented,@Inherited)

@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注释

定义注解的方法:

@interface 注解名

查看Target类,该信息包含注解的适用范围,注解的生命周期,注解的存在位置:

注:一般情况下将Retention的值定义为:Retention.RUNTIME

其ElementType.xx的类型可为下述这些:

自定义注解—不含参数:

import java.lang.annotation.*;
public class reflect{
    @myannotation1
    public void test(){
    }
}
@Retention(value= RetentionPolicy.RUNTIME)//表示该注解在运行时仍然有效
@Documented//表示将该注解生成在javadoc中
@Inherited//表示子类可以继承父类的注解
//表示该注解可应用在方法上,如果应用到类上就会报错,
//若还想应用在类上,则可在后面直接添加ElementType.TYPE
@Target({ElementType.METHOD})
@interface myannotation1 {
}

“@Target({ElementType.METHOD})”前没有添加public的原因是,java 程序是从一个 public 类的 main 函数开始执行的,就像 C 程序 是从 main() 函数开始执行一样。,只能有一个public 类是为了给类装载器提供方便,一个 public 类只能定义在以它的类名为文件名的文件中,因此在类中定义注解时,我们往往都会省略public

每个编译单元(文件)都只有一个 public 类,因为每个编译单元都只能有一个公共接
口,用 public 类来实现,该接口可以按照要求包含众多的支持包访问权限的类,如果
有一个以上的 public 类,编译器就会报错,并且 public类的名称必须与文件名相同
(严格区分大小写), 当然一个编译单元内也可以没有 public 类。

自定义注解的特点:

注:“value”也可省略不写

自定义注解—只含一个参数:

当我们在test方法中使用含有一个参数的注解,而我们并未传递任何的参数时,编译器就会如下所示,报错:

解决办法有两个:

1:在String value()后面加defau "";`,表示默认为空,此时无论是否传递参数都不会报错

2:在使用该注解时,传递参数
• 1

在上述参数名为“value”时,我们传递参数时,直接使用了具体的参数值,但是当我们的参数名是普通字符的时候,如果还使用该方法进行传递就会报错:


正确的传递方法为:

参数名="实际的参数"进行传递

自定义注解—含多个参数:

举例:

package Collections;
import java.lang.annotation.*;
public class reflect{
    @myannotation2(age=19,name="西安",schools={"家里蹲大学","新东方烹饪学校"})
    public void test(){
    }
}
@Retention(value= RetentionPolicy.RUNTIME)
@Documented@Inherited
//注解的参数:参数类型+参数名()+default[默认值]可加,可不加;
@Target({ElementType.METHOD,ElementType.TYPE})
@interface myannotation2 {
    String name();
    int age() default -1;//如果默认值为-1,代表不存在
    String[] schools();
}

参数传递的顺序可不同。

总结:参数名为value,在传递参数时,可直接传递参数,不需要写参数名,参数名为普通字符串时,格式为参数名=参数值,多个参数值进行传递时,顺序可以发生调换,并且参数名不允许重复。

相关文章
|
8天前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
13 3
|
10天前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
14 1
|
18天前
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
30 0
java 常用注解大全、注解笔记
|
6天前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
6 0
|
1月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
1月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
15天前
|
XML Java 数据格式
Java-spring注解的作用
Java-spring注解的作用
15 0
|
1月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
1月前
|
Java 编译器 测试技术
|
1月前
|
Java
扫盲java基础-注解
扫盲java基础-注解