《Java-SE-第三十八章》之注解

这篇具有很好参考价值的文章主要介绍了《Java-SE-第三十八章》之注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页

博主的github,平常所写代码皆在于此

共勉:talk is cheap, show me the code

作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



注解

概述

Java注解是Java5引入的一种注释解释,又称之为标注。Java中的类,构造器,方法,成员变量,参数等都可以被注解进行标注。我们可以将注解理解为标签,标签可以上的内容可以自由的定义,它是对人和事物属性的评价。这就如商品上的价格标签,图书馆中的书本编码标签,B站上游戏分区标签等。

注解的作用

对Java中类,方法,成员变量做标记,然后进行特殊处理,至于到底进行何种处理由具体业务决定。比如说:JUnit框架中,标注了注解为@Test的方法就可以被当成测试方法执行,而没有标记的就不能打算当初当成测试方法执行。

特殊属性

  • value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写。
  • 但是如果有多个属性,并且属性没有默认值,那么value名称不能省略。

自定义注解格式

public @interface 注解名称 {

​ public 属性类型 属性名() default 默认值;

}

代码示例

public @interface MyDemo {
    String value();
    String name();
    boolean flag() default true;
    String [] str();
}

元注解

元注解就是注解的注解,注解的标签。

常用的元注解

  1. @Target: 约束自定义注解只能在哪些地方使用
  2. @Retention:申明注解的生命周期

@Target中可使用的值定义在枚举类ElementType中,常用值如下:

  • TYPE,类
  • 接口 FIELD,
  • 成员变量METHOD,
  • 成员方法PARAMETER,
  • 方法参数CONSTRUCTOR,
  • 构造器LOCAL_VARIABLE
  • 局部变量

@Retention中可使用的值定义在枚举类ElementType中,常用值如下:

  • SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
  • CLASS: 注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
  • RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)

注解的解析

示例代码

@Target({ElementType.TYPE,ElementType.METHOD})// 当前被修饰的注解只能用在类上,方法上。
@Retention(RetentionPolicy.RUNTIME)// 控制下面的注解一直保留到运行时
public @interface  MyTest {
}

MyTest的使用

@MyTest
public class AnnotationTest {
//    @MyTest
//    private String name;

    @MyTest
    @MyDemo(value = "Annotation",name="张三",str={"java","C++"})
    public static void test() {
        System.out.println("Hello World");
    }

    public static void main(String[] args) {
        test();
    }
}

如果把@MyTest修饰在成员变量上就会报错—>java: 注释类型不适用于该类型的声明

注解的解析

注解的操作中经常需要解析,注解的解析就是判断是否存下注解,存在注解就解析出内容。

与注解解析相关的接口

  • Annotation: 注解的顶级接口,注解都是Annotation类型的对象
  • AnnotatedElement:该接口定义了与注解解析相关的解析方法

相关API如下

方法 说明
Annotation[] getDeclaredAnnotations() 获得当前对象上使用的所有注解,返回注解数组。
T getDeclaredAnnotation(Class annotationClass) 根据注解类型获得对应注解对象
boolean isAnnotationPresent(Class annotationClass) 判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false

所有的类成分Class, Method , Field , Constructor,都实现了AnnotatedElement接口他们都拥有解析注解的能力。

注解解析案例

首先定义一个MyTest2注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest2 {
    String value();
    String name();
    boolean flag() default true;
    String [] str();
}

在Demo类和方法上使用

@MyTest2(value = "大小姐",name ="林黛玉",str={"java","C++"})
public class Demo {
    @MyTest2(value = "小小姐",name ="薛宝钗",str={"java","Python"})
    public void test() {

    }

}

解析类上的注解

public class AnnotationTest2 {
    public static void main(String[] args) {
        //1.得到class对象
        Class<Demo> demoClass = Demo.class;
        //2.判断类上是否包含注解
        if (demoClass.isAnnotationPresent(MyTest2.class)) {
            MyTest2 myTest2 = demoClass.getDeclaredAnnotation(MyTest2.class);
            System.out.println(myTest2.value());
            System.out.println(myTest2.name());
            System.out.println(myTest2.flag());
            System.out.println(Arrays.toString(myTest2.str()));
        }
    }
}

运行结果:
《Java-SE-第三十八章》之注解,Java,java,开发语言

解析方法上的注解

public class AnnotationTest3 {

    public static void main(String[] args) throws NoSuchMethodException {
        //1.得到class对象
        Class<Demo> demoClass = Demo.class;
        Method test = demoClass.getDeclaredMethod("test");
        //2.判断方法对象上是否包含注解
        if (test.isAnnotationPresent(MyTest2.class)) {
            MyTest2 myTest2 = test.getDeclaredAnnotation(MyTest2.class);
            System.out.println(myTest2.value());
            System.out.println(myTest2.name());
            System.out.println(myTest2.flag());
            System.out.println(Arrays.toString(myTest2.str()));
        }
    }
}

运行结果:

《Java-SE-第三十八章》之注解,Java,java,开发语言

模拟Junit中的@Test

我们定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行

分析

  1. 定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在。
  2. 定义若干个方法。只要有@MyTest注解的方法就能在启动时被触发执行,没有这个注解的方法不能执行。

示例代码

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestDemo {
    @MyTest
    public void test1() {
        System.out.println("test1");
    }
    @MyTest
    public void test2() {
        System.out.println("test2");
    }
    @MyTest
    public void test3() {
        System.out.println("test3");
    }
    @MyTest
    public void test4() {
        System.out.println("test4");
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        TestDemo t = new TestDemo();
        //启动程序
        //1.得到TestDemo对象
        Class<TestDemo> testDemoClass = TestDemo.class;
        //提取类中的方法
        Method[] declaredMethods = testDemoClass.getDeclaredMethods();
        //触发方法
        for (Method method : declaredMethods) {
            if (method.isAnnotationPresent(MyTest.class)) {
                method.invoke(t);
            }
        }
    }
}

运行结果:

《Java-SE-第三十八章》之注解,Java,java,开发语言

各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!。

《Java-SE-第三十八章》之注解,Java,java,开发语言文章来源地址https://www.toymoban.com/news/detail-650459.html

到了这里,关于《Java-SE-第三十八章》之注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Day20-【Java SE高级】单元测试 反射 注解 动态代理

    就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1. 咱们之前是如何进行单元测试的?有啥问题? 只能在main方法编写测试代码,去调用其他方法进行测试。 无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试。 无法得到测试的报告,需要程

    2024年04月17日
    浏览(51)
  • 从零开始学习 Java:简单易懂的入门指南之反射(三十八)

    ​ 专业的解释: ​ 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; ​ 对于任意一个对象,都能够调用它的任意属性和方法; ​ 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。 ​ 通俗的理解: 利用 反射 创建的对象 可

    2024年02月08日
    浏览(49)
  • 第三十九天 Java基础学习(三十三)

    一、Servlet Java类。由Servlet容器(Tomcat)进行编译-.class -运行 产生响应结果返回给客户端浏览器。 生命周期:(方法调用流程) init:初始化方法。在第一次访问servlet时被调用一次。 service:完成servlet所做功能。每次访问servlet时都会被调用。 doGet0:只有get请求。才能访问。 doPos

    2024年02月15日
    浏览(41)
  • 【LeetCode75】第三十八题 二叉树的最近公共祖先

    目录 题目: 示例: 分析: 代码:  给我们一棵二叉树,然后给我们pq两个节点,让我们找出二叉树中它们俩的最近的公共祖先。 那么什么样的节点是它们俩的最近的公共祖先呢,是有两种情况,第一种情况的pq两个节点都在同一条路径上,像下图这样:  那这时pq的最近公

    2024年02月11日
    浏览(36)
  • 第三十三章Java快速排序法

            快速排序 (Quicksort)是对 冒泡排序 的一种改进,是一种排序执行效率很高的排序算法。         快速排序的基本思想是:通过一趟排序,将要排序的数据分隔成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分

    2024年02月11日
    浏览(55)
  • 【Java基础教程】(三十八)常用类库篇 · 第八讲:数组操作类——解析Arrays类中的全部操作方法,解锁Java数组操作技巧~

    前言:在学习本文之前,应该先学习并清楚了解Java基础部分的数组相关的概念和知识。 若还不具备学习条件,请先前往学习数组部分的基础知识: 《【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转

    2024年02月15日
    浏览(62)
  • 【从零开始学习JAVA | 第三十篇】方法引用

    目录 前言: 方法引用: 方法引用基本概念: 方法可以被引用的条件: 方法引用的种类: 方法引用的优点: 总结: 方法引用作为一个重要的知识点,虽然他使用起来很复杂,而且会降低代码的可读性,但是如果用好了方法引用,我们也会获得不错的效率,因此我们在今天

    2024年02月15日
    浏览(47)
  • JavaScript从入门到精通系列第三十八篇:详解JavaScript中DOM的查询

    😉😉 学习交流群: ✅✅1:这是 孙哥suns 给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月05日
    浏览(45)
  • 【从零开始学习JAVA | 第三十一篇】异常体系介绍

            本文我们将为大家介绍一下异常的整个体系,而我们学习异常,不是为了敲代码的时候不出异常,而是为了能够熟练的处理异常,如何解决代码中的异常。  我们就以这张图作为线索来详细介绍一下Java中的异常: 在Java中, Exception(异常)是一种表示非致命错误或异

    2024年02月15日
    浏览(91)
  • 【从零开始学习JAVA | 第三十七篇】初识多线程

    目录 前言: ​编辑 引入: 多线程:         什么是多线程:         多线程的意义:         多线程的应用场景: 总结:                 本章节我们将开始学习多线程,多线程是一个很重要的知识点,他在我们实际开发中应用广泛并且基础,可以说掌握多线程编写程

    2024年02月14日
    浏览(107)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包