Java自带注解、元注解、自定义注解的区别

 更新时间:2023年06月27日 10:09:00   作者:laluckystar  
本文主要介绍了Java自带注解、元注解、自定义注解的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是注解

1.Annotation是从JDK5.0开始引入的新技术

2.Annotation的作用 :
(1)不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
(2)可以被其他程序(比如:编译器等)读取

3.Annotation的格式:
注解是以"@注释名"在代码中存在的,还可以添加一-些参数值,例如:@SuppressWarnings(value="unchecked")

4.Annotation在哪里使用?
可以附加在package , class , method , field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问

在java中,注解分为三种类型:自带注解、元注解、自定义注解。

自带注解

java自带注解只有三个:@Override、@Deprecated、@SuppressWarnings

1.@Override :定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明
2.@Deprecated :定义在java.lang.Deprecated中, 此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素, 通常是因为它很危险或者存在更好的选择
3.@SuppressWarnings :定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息

与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了
(1)@SuppressWarngs("all")
(2)@SuppressWarnings("unchecked")
(3)@SuppressWarnings(value={"unchecked","deprecation"})等等

元注解

元注解是注解的注解,常标注于自定义注解之前,用来对注解的一个简单描述。

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

元注解一共有四个:@Target、@Retention、@Inherited、@Documented

  • @Target是自定义注释时必选的,表示该注解的作用目标。
  • @Retention注解也是必选的,表示该注解的保留策略。
  • @Inherited和@Documented是可选的元注解。

自定义注解

声明语法:

@Target(ElementType...)
@Retention(RetentionPolicy...)
权限修饰符 @interface 注解名称(){
    //注解体,可以定义属性
    属性类型 属性名() default 默认值;
}

属性声明格式:属性类型 属性名() default 默认值;

属性类型:基本数据类型(byte、short、int、long、float、double、boolean、char)、Class、String、enum、Annotation、以及上述类型的数组形式。

属性名():根据个人需求声明属性名。当属性只有一个的时候,一般属性名都写成value()。

//Spring框架注解之Component
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component{ 
  String value() default "";
}

在实际应用中,注解大多与反射结合使用。一般情况下,注解的使用是不影响代码的正常执行,它只是对代码做了一个简单的描述。但是通过注解+反射,就能够在编译时或者是运行时对代码的执行产生影响。

注解只提供对代码的描述,不影响代码的正常执行。影响代码执行的是通过反射获取注解中的属性

如何利用反射获取注解内容

利用反射获取注解内容步骤:

1.先利用反射获取Class对象

2.使用Class.getAnnotations()获取类上的所有注解内容(如果只想获取注解的值,可以使用Class.getAnnotation(XXX.class)获取特定的注解,然后在获取的注解内容使用.value()即可以获取注解的value值)

3.使用Class.getDeclaredField(“XX”)获取Class对象的特定内容的field对象,然后使用field.getAnnotation(XXX.class),获取到注解的内容

@Tablemi("mi")
class Student2 {
    @Fieldmi(name = "id", type = "int", length = 10)
    private int id;
    @Fieldmi(name = "age", type = "int", length = 3)
    private int age;
    @Fieldmi(name = "name", type = "varchar", length = 5)
    private String name;
 
    public Student2() {
    }
 
    public Student2(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }
 
}//并提供get和set方法

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablemi{
    String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldmi{
    String name();
    String type();
    int length();
}

测试代码:

Class c1 = Class.forName("com.mi.demo01.Student2");
//通过反射获取注解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
    System.out.println(annotation);
}
//获的注解的value值
Tablemi tablemi = (Tablemi)c1.getAnnotation(Tablemi.class);
String value = tablemi.value();
System.out.println(value);
//获得类指定的注解
Field field = c1.getDeclaredField("id");
Fieldmi fieldmi = field.getAnnotation(Fieldmi.class);
System.out.println(fieldmi.name());
System.out.println(fieldmi.type());
System.out.println(fieldmi.length());
//获得类指定的注解
Field field1 = c1.getDeclaredField("name");
Fieldmi fieldmi1 = field1.getAnnotation(Fieldmi.class);
System.out.println(fieldmi1.name());
System.out.println(fieldmi1.type());
System.out.println(fieldmi1.length());
//获得类指定的注解
Field field2 = c1.getDeclaredField("age");
Fieldmi fieldmi2 = field2.getAnnotation(Fieldmi.class);
System.out.println(fieldmi2.name());
System.out.println(fieldmi2.type());
System.out.println(fieldmi2.length());

测试结果:

到此这篇关于Java自带注解、元注解、自定义注解的区别的文章就介绍到这了,更多相关Java自带注解 元注解 自定义注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈spring DI 依赖注入方式和区别

    浅谈spring DI 依赖注入方式和区别

    Spring框架对Java开发的重要性不言而喻,本文主要介绍了spring DI 依赖注入方式和区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot优雅统计接口耗时实战中的四种高效方案

    SpringBoot优雅统计接口耗时实战中的四种高效方案

    这篇文章主要为大家详细介绍了SpringBoot优雅统计接口耗时实战中的四种高效方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-01-01
  • 学习不同 Java.net 语言中类似的函数结构

    学习不同 Java.net 语言中类似的函数结构

    这篇文章主要介绍了学习不同 Java.net 语言中类似的函数结构,函数式编程语言包含多个系列的常见函数。但开发人员有时很难在语言之间进行切换,因为熟悉的函数具有不熟悉的名称。函数式语言倾向于基于函数范例来命名这些常见函数。,需要的朋友可以参考下
    2019-06-06
  • SpringAOP四种通知类型+环绕通知说明

    SpringAOP四种通知类型+环绕通知说明

    这篇文章主要介绍了SpringAOP四种通知类型+环绕通知说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 基于eclipse-temurin镜像部署spring boot应用的实现示例

    基于eclipse-temurin镜像部署spring boot应用的实现示例

    本文提供了基于eclipse-temurin镜像部署Spring Boot应用的详细实现示例,通过使用Docker镜像,可以轻松地创建和管理Spring Boot应用程序的容器化环境,感兴趣的可以了解一下
    2023-08-08
  • Java多线程工具CompletableFuture详解

    Java多线程工具CompletableFuture详解

    这篇文章主要介绍了Java多线程工具CompletableFuture详解,CompletableFuture 是 java 1.8 追加的新特性,通俗的话来说,是一个函数式的,用于控制多任务同步、异步组合操作的工具,需要的朋友可以参考下
    2024-01-01
  • Java多线程并发与并行和线程与进程案例

    Java多线程并发与并行和线程与进程案例

    这篇文章主要介绍了Java多线程并发与并行和线程与进程案例,文章基于Java的相关资料展开详细的内容介绍,具有一定的参考价价值,需要的小伙伴可以参考一下
    2022-06-06
  • springBoot项目启动类启动无法访问的解决方法

    springBoot项目启动类启动无法访问的解决方法

    这篇文章主要介绍了springBoot项目启动类启动无法访问的解决方法,需要的朋友可以参考下
    2018-10-10
  • Java POI实现将导入Excel文件的示例代码

    Java POI实现将导入Excel文件的示例代码

    这篇文章主要介绍了Java POI实现将导入Excel文件的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • SpringBoot实现缓存组件配置动态切换的步骤详解

    SpringBoot实现缓存组件配置动态切换的步骤详解

    现在有多个springboot项目,但是不同的项目中使用的缓存组件是不一样的,有的项目使用redis,有的项目使用ctgcache,现在需要用同一套代码通过配置开关,在不同的项目中切换这两种缓存,本文介绍了SpringBoot实现缓存组件配置动态切换的步骤,需要的朋友可以参考下
    2024-07-07

最新评论