详解java注解相关知识

 更新时间:2021年06月25日 11:50:02   作者:红旗下的小兵  
今天给大家带来的是关于Java的相关知识,文章围绕着java注解的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

定义

 1、如果注解中有属性,那么必须给属性赋值。

package com.lxc.Test;
 
// 定义一个注解
public @interface Annotation {
    String name(); // 看似name像一个方法,实际上我们把name称为属性
}

使用上边注解:

package com.lxc.Test;
 
public class Test {
    @Annotation(name="lxc")
    public void test() {
    }
}

2、如果注解中有属性,且没有定义默认值,那么在使用注解的时候,必须给属性赋值。

public @interface Annotation {
    String name();
    int age();
}
public class Test {
    @Annotation(name="lxc", age=20)
    public void test() {
    }
}

但是注解中如果有默认值,在使用注解时,可以不给属性赋值

public class Test {
    @Annotation(name="lxc")
    public void test() {
    }
}
public @interface Annotation {
    String name();
    String password() default "123";
}

3、value() 属性

如果注解中的一个属性名是value,且有且只有一个value(),在使用注解的时候,属性名可以省略

public class Test {
    @Annotation("lxc")
    public void test() {
    }
}
public @interface Annotation {
    String value();
    String password() default "123";
}

注解中属性的类型有哪些

byte、short、int、float、double、boolean、char、String、Class、枚举

数组:

如果数组属性中有一个元素,那么数组的大括号可以省略:

public @interface Annotation {
    String[] name();
}
public class Test {
    // @Annotation(name={"lxc"}) // 写法一
    @Annotation(name="lxc") // 写法二
    public void test() {
    }
}

枚举:

public enum MyEnum {
    className, name, age,
}
public @interface Annotation {
    String[] name();
    MyEnum[] student();
}
public class Test {
    @Annotation(name="lxc", student = {MyEnum.className, MyEnum.age})
    public void test() {
    }
}

注解如何使用:

(1)标记一个注解只能出现在类或者方法上

@Target(value = {ElementType.TYPE, ElementType.METHOD})
public @interface Annotation {
    String userName();
    MyEnum[] student();
}

(2)标记一个注解可以被反射机制所读取

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 标记注解只能出现在类上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 标记注解可以被反射机制所读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
    String userName();
    MyEnum[] student();
}

获取注解中的属性值

通过反射机制来获取。

(1)获取类上边注解的属性:

注解类:

package com.lxc.Test;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 标记注解只能出现在类上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 标记注解可以被反射机制所读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
    String userName() default "吕星辰";
}

使用注解类:

// myAnnotation 
@Annotation(userName = "哈哈")
public class myAnnotation {
}

获取注解类中 的属性:

package com.lxc.Test;
/**
 * c.isAnnotationPresent(注解类.class) : 判断一个类上是否有注解,返回true、false
 * c.getAnnotation(注解类.class) : 获取注解类的实例
 *
 */
public class Test {
    public static void main(String[] args) throws Exception{
        Class c = Class.forName("com.lxc.Test.myAnnotation");
        System.out.println(c.isAnnotationPresent(Annotation.class));
        // 判断一个类是否有:Annotation这个注解
        if(c.isAnnotationPresent(Annotation.class)) {
            // 获取注解对象
            Annotation ann = (Annotation) c.getAnnotation(Annotation.class);
            // 通过注解对象获取属性值
            System.out.println(ann.userName());
        }
    }
}

(2)获取类中方法上边注解的属性:

注解类:

package com.lxc.Test;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// 标记注解只能出现在类上
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 标记注解可以被反射机制所读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
    String userName();
    String password();
}

在方法上使用注解及获取方法上边的注解:
分析:想获取方法上的注解,首先需要获取该方法,获取该方法的前提,获取该方法的类:

package com.lxc.Test;
 
import java.lang.reflect.Method;
 
public class UserAnnotation {
    @Annotation(userName = "lxc", password = "123")
    public void getUser() {}
 
    public static void main(String[] args) throws Exception{
        // 通过反射获取类
        Class c = Class.forName("com.lxc.Test.UserAnnotation");
        // 通过反射获取类中的方法
        Method getUserMethod = c.getDeclaredMethod("getUser");
        // 判断方法是否有 Annotation 这个注解
        if(getUserMethod.isAnnotationPresent(Annotation.class)) {
            Annotation ann = getUserMethod.getAnnotation(Annotation.class);
            System.out.println(ann.userName()); // lxc
            System.out.println(ann.password()); // 123
        }
    }
}

到此这篇关于详解java注解的使用的文章就介绍到这了,更多相关java注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot结合Redis哨兵模式的实现示例

    SpringBoot结合Redis哨兵模式的实现示例

    这篇文章主要介绍了SpringBoot结合Redis哨兵模式的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 解决springcloud中Feign导入依赖为unknow的情况

    解决springcloud中Feign导入依赖为unknow的情况

    这篇文章主要介绍了解决springcloud中Feign导入依赖为unknow的情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中的装箱和拆箱深入理解

    Java中的装箱和拆箱深入理解

    装箱和拆箱是java中老生常谈的问题,下面小编通过本文给大家介绍java装箱和拆箱最基本的东西,感兴趣的朋友一起看下吧
    2016-07-07
  • Java中ArrayBlockingQueue和LinkedBlockingQueue

    Java中ArrayBlockingQueue和LinkedBlockingQueue

    这篇文章主要介绍了Java中ArrayBlockingQueue和LinkedBlockingQueue,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • Java 时间格式转换之impleDateFormat与Data API解析与使用

    Java 时间格式转换之impleDateFormat与Data API解析与使用

    想必大家对 SimpleDateFormat 并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,他是以区域敏感的方式格式化和解析日期的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化
    2021-11-11
  • Spring Boot中使用Spring-Retry重试框架的实现

    Spring Boot中使用Spring-Retry重试框架的实现

    本文主要介绍了Spring Boot中使用Spring-Retry重试框架的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 利用Java实现解析网页中的内容

    利用Java实现解析网页中的内容

    这篇文章主要为大家详细介绍了如何利用Java语言做一个解析指定网址的网页内容小应用,文中的实现步骤讲解详细,感兴趣的可以尝试下
    2022-10-10
  • spring-boot使用AOP统一处理日志

    spring-boot使用AOP统一处理日志

    这篇文章主要为大家详细介绍了spring-boot使用AOP统一处理日志,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Java实现浪漫流星表白的示例代码

    Java实现浪漫流星表白的示例代码

    本文将利用Java语言实现浪漫流星表白,可以实现这些功能:播放音乐、自定义流星数量、飞行速度、光晕大小、流星大小,自定义表白话语,感兴趣的可以学习一下
    2022-05-05
  • sa-token 路由拦截式鉴权使用示例详解

    sa-token 路由拦截式鉴权使用示例详解

    这篇文章主要为大家介绍了sa-token 路由拦截式鉴权使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论