广告
返回顶部
首页 > 资讯 > 精选 >Java5.0中注解如何使用
  • 743
分享到

Java5.0中注解如何使用

2023-06-20 16:06:05 743人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Java5.0中注解如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。元注解Meta-annotation元注解的作用就是负责注解其他注解。Java5.0定义

这篇文章将为大家详细讲解有关Java5.0中注解如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

元注解Meta-annotation

元注解的作用就是负责注解其他注解。

Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

Java5.0定义的元注解: 

  • - @Target

  • - @Retention

  • - @Documented

  • - @Inherited

这几个类都在java.lang.annotation包中

@Target

@Target主要说明Annotation所修饰的对象范围。

Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。

在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

作用:用于描述注解的使用范围,即被描述的注解可以用在什么地方。

取值(ElementType)有: @Target(ElementType.XXX)取值如下

  • - TYPE:类、接口、注解类、Enum声明处,相应的注解称为类型注解

  • - FIELD:类成员变量或者常量声明处,相应的注解被称为域值注解

  • - METHOD:方法处声明,相应的注解称为方法注解

  • - PARAMETER:参数声明处,相应的注解称为参数注解

  • - CONSTRUCTOR:构造函数声明处,相应的注解称为构造函数注解

  • - LOCAL_VARIABLE:局部变量声明处,相应的注解称为局域比纳凉注解

  • - PACKAGE:包声明处,相应的注解被称为包注解

举例:

import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DataSource {    // 和配置文件中 dynamicDatasourceMap中的key保持一致    public static String PR_RB = "dataSourcePR";    public static String DR_RB = "dataSourceDR";    public static String PR_CC = "dataSourceCC";        String name() default DataSource.PR_RB;}

@Retention

@Retention定义了该Annotation被保留的时间长短.

某些Annotation仅出现在源代码中,而被编译器丢弃;

而另一些却被编译在class文件中,编译在class文件中的Annotation可能会被虚拟机忽略,

而另一些在class被装载时将被读取(并不影响class的执行,因为Annotation与class在使用上是被分离的)。

使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即被描述的注解在什么范围内有效)

Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。

Java5.0中注解如何使用

取值(RetentionPoicy)有:

  • SOURCE:在源文件中有效(即源文件保留),单对应的字节码文件将不再保留

  • CLASS:在class文件中有效(即class保留),但类家爱妻加载字节码文件时不会将注解加载到JVM中,即运行期不能获取注解信息

  • RUNTIME:在运行时有效(即运行时保留),注解信息在目标类加载到JVM后依然保留,在运行期可以通过反射机制读取类中的注解信息

比如

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DataSource {    .......}

@Documented

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共api,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DataSource {    .......}

@Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。

在定义注解时,不能继承其他的注解或接口。

@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。

方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。

可以通过default来声明参数的默认值。

定义注解格式:

 public @interface 注解名 {定义体}

注解参数的可支持数据类型

所有基本数据类型(int,float,boolean,byte,double,char,long,short)

  • String类型

  • Class类型

  • enum类型

  • Annotation类型

  • 以上所有类型的数组

Annotation类型里面的参数设定规则:

第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   

第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  

第三,如果只有一个参数成员,最好把参数名称设为”value”,后加小括号.

实例

代码已托管到GitHub—> https://github.com/yangshangwei/springMaster

通常情况下,第三方工具不但负责处理特定的注解,其本身还提供了这些注解的定义。 事实上,定义注解类本身并不困难,Java提供了定义注解的语法,如上所述。

编写注解类

我们着手来编写一个简单的注解类

package com.xgj.aop.spring.advisor.anno;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;// 声明注解的保留期限@Retention(RetentionPolicy.RUNTIME)// 声明可以使用该注解的目标类型@Target(ElementType.METHOD)// 可以被javadoc此类的工具文档化@Documentedpublic @interface NeedTestAnnotation { // 定义注解    // 声明注解成员    boolean value() default false;}

Java新语法规定使用@interface修饰符定义注解类,一个注解可以拥有多个成员,成员声明和接口方法声明类似,这里仅仅定义了一个成员。

成员声明以下几点限制:

  • 成员以无入参,无抛出异常的方式声明, 以下方式是不合法的 比如 boolean value(String xx)、boolean value()throws Exception等是非法的

  • 可以通过default成员指定一个默认值,比如 String level() defalut “LOW_LEVEL”, int high() default 2 是合法的,当然也可以不指定默认值。

  • 成员类型是受限制的,成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;   而 List foo() 、ForumServer value()是不合法的。

如果注解只有一个成员,成员名建议为value().

在使用时可以忽略成员和赋值号(=),比如 @NeedTestAnnotation(true).

当注解类拥有多个成员时,如果仅仅对value成员进行赋值,则也可不使用赋值号。

如果同时对多个成员进行赋值,这必须使用赋值号,比如 @DecalreParents(value=”XXX”,defaultImpl=XXX).

注解类可以没有成员,没有成员的注解称为标注注解,解释程序以标识注解存在与否进行相应的处理

此外,所有的注解都隐式继承与java.lang.annotation.Annotation,但注解不允许显示继承其他的接口。

使用注解

我们在业务类中,使用NeedTestAnnotation注解,标注业务方法是否需要测试

如下

package com.xgj.aop.spring.advisor.anno;public class ForumService {    @NeedTestAnnotation    public void removeTopicId(int topicId) {        System.out.println("remove topicId" + topicId);    }    @NeedTestAnnotation(true)    public void removeForumId(int forumId) {        System.out.println("remove forumId" + forumId);    }}

如果注解类和目标类不在同一个包中,这需要通过improt引用注解类。

在标注注解时,可以通过以下格式对注解成员进行赋值

@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,.....)

如果成员是数组类型,这可以通过{}进行赋值,比如 boolean数组的成员可以设置为{true,false,true}

访问注解

我们说过,注解不会直接影响程序的运行,但是第三方程序或者工具可以利用代码中的注解完成特殊的任务,间接控制程序的运行。 对于RetentionPolicy.RUNTIME保留期限的注解,可以通过反射机制访问类中的注解。

在Java5.0中,Package、Class、Constructor、Method以及Field 等反射对象都新增了访问注解信息的方法:<T extends Annotation>T getAnnotation(Class<T> annotationClass)该方法支持通过泛型直接返回注解对象.

下面通过反射来访问注解,得到ForumService类中通过@NeedTestAnnotation注解所承载的测试需求

package com.xgj.aop.spring.advisor.anno;import java.lang.reflect.Method;import org.junit.Test;public class AnnotaitionSelfDefineTool {    @Test    public void test() {        // 得到对应的Class        Class<ForumService> clazz = ForumService.class;        // 因为标注在方法上,所以先得到对应的方法        Method[] methods = clazz.getDeclaredMethods();        System.out.println(clazz.getName() + " 有 " + methods.length + " 个方法");        // 遍历方法        for (Method method : methods) {            // 获取方法上的注解            NeedTestAnnotation needTestAnnotation = method                    .getAnnotation(NeedTestAnnotation.class);            // 判断是否有标注此注解            if (needTestAnnotation != null) {                // 获取注解中定义的值,做处理                if (needTestAnnotation.value()) {                    System.out.println(method.getName() + "需要测试");                } else {                    System.out.println(method.getName() + "不需要测试");                }            }        }    }}

单元测试结果:

com.xgj.aop.spring.advisor.anno.ForumService 有 2 个方法

removeTopicId不需要测试

removeForumId需要测试

关于Java5.0中注解如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java5.0中注解如何使用

本文链接: https://www.lsjlt.com/news/298410.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java5.0中注解如何使用
    这篇文章将为大家详细讲解有关Java5.0中注解如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。元注解Meta-annotation元注解的作用就是负责注解其他注解。Java5.0定义...
    99+
    2023-06-20
  • JPA中如何使用@EntityListeners注解
    这篇文章给大家介绍JPA中如何使用@EntityListeners注解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JPA实体类监听器@EntityListeners注解的使用被@Prepersist注解的方法 ,完成...
    99+
    2023-06-20
  • springboot中@component注解如何使用
    这篇文章主要介绍“springboot中@component注解如何使用”,在日常操作中,相信很多人在springboot中@component注解如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spr...
    99+
    2023-06-29
  • Java中如何使用Spring注解
    Java中如何使用Spring注解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入contex...
    99+
    2023-06-20
  • 注解如何在JAVA中使用
    注解如何在JAVA中使用 ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。何为注解注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是:生成...
    99+
    2023-05-31
    java 注解 ava
  • MybatisPlus中@Version注解如何使用
    这篇文章主要讲解了“MybatisPlus中@Version注解如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MybatisPlus中@Version注解如何使用”吧!注解说明在 M...
    99+
    2023-07-02
  • Spring中@ModelAttribute注解如何使用
    这期内容当中小编将会给大家带来有关Spring中@ModelAttribute注解如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.@ModelAttribute注释方法   例子(1)...
    99+
    2023-06-02
  • spring中如何使用@Service注解
    本篇文章为大家展示了spring中如何使用@Service注解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。@Service注解的使用要说明@Service注解的使用,就得说一下我们经常在sprin...
    99+
    2023-06-20
  • Lombok中@EqualsAndHashCode注解如何使用
    这篇文章主要介绍“Lombok中@EqualsAndHashCode注解如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Lombok中@EqualsAndHashCode注解如何使用”文章能帮...
    99+
    2023-07-05
  • 如何在Android中使用 AOP注解
    今天就跟大家聊聊有关如何在Android中使用 AOP注解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、简介在Android 里面 注解主要用来干这么几件事:和编译器一起给你一些...
    99+
    2023-05-31
    android aop 注解
  • @profile注解如何在spring中使用
    本篇文章给大家分享的是有关@profile注解如何在spring中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先是新建maven工程mvn archetype:gene...
    99+
    2023-05-30
    spring profile
  • @RequestParam注解如何在SpringMVC中使用
    这期内容当中小编将会给大家带来有关@RequestParam注解如何在SpringMVC中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。自SpringMVC4.2之后,RequestParam内部有4...
    99+
    2023-05-31
    springmvc @requestparam ue
  • 如何在Spring中使用@Transactional注解
    这期内容当中小编将会给大家带来有关如何在Spring中使用@Transactional注解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Transactionalservice A(){try...
    99+
    2023-06-15
  • 如何使用RequiredArgsConstructor注解
    这篇文章主要讲解了“如何使用RequiredArgsConstructor注解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用RequiredArgsConstructor注解”吧!爆...
    99+
    2023-06-16
  • @AliasFor注解如何使用
    本篇内容主要讲解“@AliasFor注解如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“@AliasFor注解如何使用”吧!一、前言@AliasFor注解基本上都是在spring源码当中出...
    99+
    2023-07-05
  • @Query注解如何使用
    这篇文章主要讲解了“@Query注解如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“@Query注解如何使用”吧!@Query注解的用法1.一个使用@Query注解的简单例子@Quer...
    99+
    2023-06-29
  • SpringBoot中@Import注解如何正确使用
    目录简介一、功能简介二、示例1.引入普通类2.引入ImportSelector的实现类(1)静态import场景(注入已知的类)(2)动态import场景(注入指定条件的类...
    99+
    2022-11-13
  • Java中自定义注解如何使用
    本文小编为大家详细介绍“Java中自定义注解如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中自定义注解如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是注解在早期的工作的时候 ,自定义...
    99+
    2023-07-05
  • 如何正确使用注解
    本篇内容介绍了“如何正确使用注解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!日志脱敏场景简介在日志里我们的日志一般打印的是 model 的...
    99+
    2023-06-16
  • Spring @InitBinder注解如何使用
    这篇文章主要讲解了“Spring @InitBinder注解如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring @InitBinder注解如何使用”吧!一...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作