Annotation

Annotation是一个接口,可以把Annotation当成一个修饰符

Annotation的定义

注解通过@interface定义

public @interface TestAnnotation {
  //Annotation的成员变量通过无形参的方法形式声明,方法名和返回值表示成员变量的名字和类型
  String name();
  //默认值通过default指定
  int age() default 32;
}

提取Annotation的信息

提取Annotation的信息需要用到java.lang.reflect的反射API,并且在定义Annotation的@Retention要指定为RetentionPolicy.RUNTIME

5个基本的Annotation

@Override->强制重写父类的方法,避免出现父类方法名和子类方法名不一致的错误

@Deprecated->标记方法已过时

@Suppress Warnings->取消编译器的警告

@Safe Varages->解决“堆污染”

 public static void main(String[] args) {
List list = new ArrayList();
list.add(20);
//当把一个不带泛型的对象赋值给一个带泛型的变量,引发的错误叫“堆污染”,发生ClassCastException
List<String> ls = list;
System.out.println(ls.get(0));
}

@FunctionalInterface->标记接口是一个函数式接口

@FunctionalInterface
//函数式接口中有一个抽象方法,多个静态方法和默认方法,如果试图声明第二个抽象方法,会报错
public interface Test {
void a();
default void b(){
System.out.println("b");
}
static void c() {
System.out.println("c");
}
}

6个Meta Annotation

@Retention

Retention用于修饰Annotation,作用是指定修饰的Annotation可以保留多长时间

//Retention有一个RetentionPolicy的成员变量value
// value的取值:RetentionPolicy.RUNTIME,RetentionPolicy.CLASS,RetentionPolicy.SOURCE
//RUNTIME、CLASS会将Annotation记录在class文件中,SOURCE会直接丢弃Annotation
//RUNTIME可以通过反射获取Annotation的信息,class不可以
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}

@Target

Target用于修饰Annotation,作用是指定Annotation可以修饰那些程序单元

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
//Retention有一个ElementType的成员变量value
@Target(ElementType.FIELD)
public @interface Test {
}
class A{
@Test
private int a;
}

@Documented

Documented用于修饰Annotation,作用是指定被Documented修饰的Annotation类会被javadoc提取成文档

@Inherited

Inherited用于修饰Annotation,作用是指定被修饰的Annotation具有继承性

@Inherited
//注意这要写上RUNTIME,不然下边的isAnnotationPresent()不能通过反射拿到Annotation信息
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
} @Test
class A{
}
//B类并未使用@Test注解,但是B类也被@Test修饰了
class B extends A{
public static void main(String[] args){
System.out.println(B.class.isAnnotationPresent(Test.class));
}
}

@Repeatable

Repeatable用于修饰Annotation,可以使用多个相同名字的注解

//在没有使用Repeatable前,我们要给某个程序元素注解多个相同名字的注解时,必须要有一个容器注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Result{
String name();
int age();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Results{
Result[] value();
}
@Results({@Result(name="张三",age=16),
@Result(name="李四",age=20)}
)
class Person{
public static void main(String[] args){
Class<Person> pClass = Person.class;
Results results = pClass.getDeclaredAnnotation(Results.class);
System.out.println(results);
}
}
//使用Repeatable注解修改
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Results.class)
public @interface Result{
String name();
int age();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Results{
Result[] value();
}
@Result(name="张三",age=16)
@Result(name="李四",age=20)
class Person{
public static void main(String[] args){
Class<Person> pClass = Person.class;
Results results = pClass.getDeclaredAnnotation(Results.class);
System.out.println(results);
}
}

实际上任然需要容器注解,只是红色的部分写法发生了变化

ElemType

Java 8 中 ElementType 增加了 ElementType.TYPE_USE 和 ElementType.TYPE_PARAMETER。它们都可以限制哪个类型可以进行注解。能在局部变量、泛型类、父类和接口的实现处使用,甚至能在方法上声明异常的地方使用。

ElementType.TYPE_PARAMETER(Type parameter declaration) 用来标注类型参数。

@Target(ElementType.TYPE_PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeParameterAnnotation { } // 如下是该注解的使用例子
public class TypeParameterClass<@TypeParameterAnnotation T> {
public <@TypeParameterAnnotation U> T foo(T t) {
return null;
}
}

ElementType.TYPE_USE(Use of a type) 能标注任何类型名称,包括上面这个(ElementType.TYPE_PARAMETER的)

ublic class TestTypeUse {

    @Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeUseAnnotation { } public static @TypeUseAnnotation class TypeUseClass<@TypeUseAnnotation T> extends @TypeUseAnnotation Object {
public void foo(@TypeUseAnnotation T t) throws @TypeUseAnnotation Exception { }
} // 如下注解的使用都是合法的
@SuppressWarnings({ "rawtypes", "unused", "resource" })
public static void main(String[] args) throws Exception {
TypeUseClass<@TypeUseAnnotation String> typeUseClass = new @TypeUseAnnotation TypeUseClass<>();
typeUseClass.foo("");
List<@TypeUseAnnotation Comparable> list1 = new ArrayList<>();
List<? extends Comparable> list2 = new ArrayList<@TypeUseAnnotation Comparable>();
@TypeUseAnnotation String text = (@TypeUseAnnotation String)new Object();
java.util. @TypeUseAnnotation Scanner console = new java.util.@TypeUseAnnotation Scanner(System.in);
}
}

JavaSE笔记-注释的更多相关文章

  1. JAVASE笔记回顾

    第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ, ...

  2. c++语言的学习笔记代码与笔记注释《函数部分》

    具体的笔记以注释的形式写在代码内,每个知识点用函数的形式表现. #include <iostream>; #include<cmath> const double PI=3.1 ...

  3. javaSE 笔记一

    java 环境变量配置 步骤:   右键[计算机]图标 –>[属性]–>[高级系统设置]–>[环境变量]   在"系统变量"里找到"Path" ...

  4. Python核心编程笔记----注释

    python 中注释有两种 第一种,文档注释 第二种,一般的注释 下面是例子: class MyClass: '这个是文档注释' def __repr__(self): return "re ...

  5. QTP自动化测试-笔记 注释、大小写

    1 rem 注释内容 2 ' 注释内容 3 快捷键注释-选择代码行-ctrl+M 4 ctrl+shift+同- 取消注释 大小写 qtp:对小写敏感:如果 变量.sheet页是用小写字母命名,则使用 ...

  6. c++语言的学习笔记代码与笔记注释《面向对象部分》

    #include <iostream> /*这是C++中关于面向对象部分的具体笔记和代码 */ //定义类的语法形式; //类中的成员项目之间相互引用,直接使用成员; //类外引用成员的时 ...

  7. 【Python】2.11学习笔记 注释,print,input,数据类型,标识符

    前面学了好多内存什么的知识,没什么用(我有眼不识泰山233 吐槽一句,这课简直就是讲给完全的编程小白听得 就从语言开始写吧(其实好多已经看过了,再来一遍 话说我已经忘了\(Markdown\)怎么写了 ...

  8. JavaSE笔记-泛型

    定义带泛型的类 public class Cat<T> { //可以用T定义实例变量 private T name; //可以用T定义形参 //构造器没有<> public C ...

  9. JavaSE笔记-异常

    Java 异常 Throwable类的体系结构(一些常用的) 异常分类 checked,unchecked 区分:RuntimeException及其子类,Error类及其子类,是unchecked ...

随机推荐

  1. LCA-RMQ+欧拉序

    还是那一道洛谷的板子题来说吧 传送门 其实好几天之前就写了 结果dr实在是太弱了 没有那么多的精力 于是就一直咕咕咕了 哎 今天终于补上来了 LCA概念传送门 RMQ传送门 这个算法是基于RMQ和欧拉 ...

  2. Python第一天:你必须要知道的Python擅长领域以及各种重点学习框架(包含Python在世界上的应用)

    目录 Python5大擅长领域 WEB开发 网络编程 科学运算 GUI图形开发 运维自动化 Python在世界上的知名应用 国外 谷歌 CIA NASA YouTube Dropbox Instagr ...

  3. 1 Introduction

    1. Introduction 1.1. License Flowable is distributed under the Apache V2 license. 1.2. Download http ...

  4. OCR技术浅析-自写篇(2)

    本例仅以本人浅薄理解,妄想自制文字识别程序,实际在识别部分未有完善. <?php class readChar{ private $imgSize; //图片尺寸 private $imgGd2 ...

  5. flask刷新token

    我们在做前后端分离的项目中,最常用的都是使用token认证. 登录后将用户信息,过期时间以及私钥一起加密生成token,但是比较头疼的就是token过期刷新的问题,因为用户在登录后,如果在使用过程中, ...

  6. 几种c++字符串split 函数实现的比较

    文中的字符串split函数功能是 从字符串中按照特定的分隔符进行分割,分割的结果保存到std::vector中. 1. strtok实现 std::vector<std::string> ...

  7. 小小知识点(六)——算法中的P问题、NP问题、NP完全问题和NP难问题

    转自CSDN默一鸣 https://blog.csdn.net/yimingsilence/article/details/80004032 在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或 ...

  8. PS绘制飘逸彩色丝带教程

    一.新建一个大小适当的图像,点击工具栏上的钢笔工具,使用形状图层来绘制出下图的形状. 二.把形状所在层的填充设为0%,填充设成0是不会影响到图层的,不像不透明度那样会影响图层样式的效果. 三.双击丝带 ...

  9. 使用.net core efcore根据数据库结构自动生成实体类

    源码 github,已更新最新代码 https://github.com/leoparddne/GenEntities/ 使用的DB是mysql,所有先nuget一下mysql.data 创建t4模板 ...

  10. 只能用Android studio做平台移植了! 在Windows10下, 开发Android。

    安装好IDE后, 会一直显示同步失败, 看看如下步骤: 需要注意的是: -> 安装NDK      自带的NDK版本有问题    自己去下一个15版本的 -> 按照系统提示一步一步安装其他 ...