@Target元注解的使用
@Target注解标记另外的注解用于限制此注解可以应用哪种Java元素类型。
先看Java SE 8中@Target是如何声明的:
package java.lang.annotation;
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
从源代码的注释中,我们看到java.lang.annotation.ElementType此枚举类声明了有哪些Java元素类型:
java.lang.annotation.ElementType.TYPE:类、接口(包括注解类型)和枚举的声明
java.lang.annotation.ElementType.FIELD:字段声明(包括枚举常量)
java.lang.annotation.ElementType.METHOD:方法声明
java.lang.annotation.ElementType.PARAMETER:参数声明
java.lang.annotation.ElementType.CONSTRUCTOR:构造函数声明
java.lang.annotation.ElementType.LOCAL_VARIABLE:本地变量声明
java.lang.annotation.ElementType.ANNOTATION_TYPE:注解类型声明
java.lang.annotation.ElementType.PACKAGE:包声明
java.lang.annotation.ElementType.TYPE_PARAMETER:类型参数声明,JavaSE8引进,可以应用于类的泛型声明之处
java.lang.annotation.ElementType.TYPE_USE:JavaSE8引进,此类型包括类型声明和类型参数声明,是为了方便设计者进行类型检查,例如,如果使用@Target(ElementType.TYPE_USE)对@NonNull进行标记,则类型检查器可以将@NonNull class C {...} C类的所有变量都视为非null
注意:如果一个注解没有指定@Target注解,则此注解可以用于除了TYPE_PARAMETER和TYPE_USE以外的任何地方。
以下我们看看ElementType.TYPE_PARAMETER和ElementType.TYPE_USE的使用示例,对于其他的ElementType注解元素,看其说明就知道怎么用了:
声明由ElementType.TYPE_PARAMETER标记的@NotEmpty注解:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author 春晨
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10264624.html
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_PARAMETER)
public @interface NotEmpty {
}
声明由ElementType.TYPE_USE标记的@NotEmpty注解:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author 春晨
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10264624.html
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface NotNull {
}
以下示例代码说明了这两种Target注解元素的使用区别,ElementType.TYPE_USE包含了ElementType.TYPE和ElementType.TYPE_PARAMETER
package org.springmorning.demo.javabase.annotation.meta; /**
* @author 春晨
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10264624.html
*/
import java.util.ArrayList; //泛型类型声明时,使用TYPE_USE类型,编译通过
class A <@NotNull TT>{} //泛型类型声明时,使用使用TYPE_PARAMETER类型,编译通过
public class TypeParameterAndTypeUseAnnotation<@NotEmpty T>{ //使用TYPE_PARAMETER类型,会编译不通过
// public @NotEmpty T test(@NotEmpty T a){
// new ArrayList<@NotEmpty String>();
// return a;
// } //使用TYPE_USE类型,编译通过
public @NotNull T test(@NotNull T a){
new ArrayList<@NotNull String>();
return a;
}
}
下节继续
下节将给大家讲解元注解@Retention的使用。
@Target元注解的使用的更多相关文章
- 元注解——java.lang.annotation.Target(1.8)
参考资料:https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html 普通注解’只能用来注解’代码’,而’元注 ...
- Java元注解—— @Retention @Target @Document @Inherited
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy. ...
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...
- Java 元注解
元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elemen ...
- Java元注解
元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种. 1.@Retention: 定义注解的保留策略@Retention(RetentionP ...
- [读书笔记] 二、条件注解@Conditional,组合注解,元注解
一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...
- 自定义注解,andjdk提供的元注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitN ...
- Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)
一.组合注解与元注解 从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置.Spring的注解主要用来配置注入Bean,切面相关配置(@Trans ...
- Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...
- 【Java编程思想笔记】注解--元注解
参考文章:(小白的小小白的白 )https://blog.csdn.net/weixin_42315600/article/details/80630669 https://www.cnblogs.c ...
随机推荐
- Rancher 系列文章-Rancher 对接 Active Directory 实战
概述 只要是个公司,基本上都有邮箱和 AD(Active Directory). 在 AD 里,已经有了: 用户 账号密码 邮箱 用户组 组织架构 所以对于一些仅限于本公司一定范围内人员使用的管理或后 ...
- .Net 7 轻松上手Dapr之服务调用
前言 对于Dapr ,在项目中也有用过一段时间,优缺点并存,但是瑕不掩瑜,目前随着版本的迭代和第三方团队对它的支持也使得我们用得更加得心应手,所以借此也回顾一下Dapr的相关知识以及分享一下项目中用到 ...
- 第一次博客:PTA题目集1-3总结
第一次博客:PTA题目集1-3总结 前言:JAVA是一门非常好的语言,因其面向对象的思想,在解决问题时思路与上学期学习的C语言截然不同,但是其优势也是显然易见的,特别是在写大型程序时其面向对象的思想, ...
- selenium验证码处理-打码平台操作
1.进入打码平台(超人,斐斐) 斐斐-------官网: 超人-------官网: 2.选择对应的开发文档,下载对应的demo示例,并把demo的python脚本放到项目包管理地址去 参考: 超人的开 ...
- OWASP TOP 10 2021
OWASP TOP 10 2021 2021 年的 TOP 10 中有 3 个新类别.4 个更改了名称和范围的类别以及一些合并. A01. 失效的访问控制 Broken Access Control ...
- [数据库]Ubuntu Linux/Kylin: 安装MySQL
1 文由 由于安装环境较为特殊,实在折煞人也.而此环境的网络博客/教程偏少,觉得有必要记录一下. 2 环境 安装主机不支持联网 即 不支持APT/APT-GET等傻瓜式的在线安装方式. 硬件架构: A ...
- [数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)
1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它 ...
- Idea快捷键——查找源码
双击shift 输入要查找源码类 相当于查 java_jdk_chm Ctrl+F12 :浏览类
- Docker 配置阿里云或腾讯云镜像加速
1.新建 /etc/docker/daemon.json 文件,并写入以下内容: 阿里云按下面配置 sudo tee /etc/docker/daemon.json <<-'EOF' { ...
- 上传了ipa但在苹果App Store中没有看到构建版本的问题
AU上传ipa出现下图红框提示说明成功上传,但有时App Store后台没有出现构建版本,请查看下面详细说明! 编辑 一.首先登录iTunes Connect 后台.查看ipa构建情况 http ...