Java基础-学习使用Annotation注解对象

注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某

个时刻非常方便地使用这些数据

1-1:基本语法

Java SE5内置三种标准注解

@Override:表示当前的方法定义将覆盖超类中的方法.如果你不小心拼写错误,或者方法签名对不上被覆

盖的方法,编译器就会发出错误提示

@Deprecated:如果程序员使用了注解为它的元素,那么编译器就会发出警告信息

@SupperessWarnings:关闭不当的编译器警告信息.

Java SE5内置四种元注解

@Target:表示该注解可以用于什么地方.可能的ElementType参数包括:

1)CONSTRUCTOR:构造器的声明

2)FIELD:域声明(包括enum实例)

3)LOCAL_VARIABLE:局部变量声明

4)METHOD:方法声明

5)PACKAGE:包声明

6)PARAMETER:参数声明

7)TYPE:类、接口(包括注解类型)或enum声明

@Retention:表示需要在什么级别保存该注解信息.可选的RetentionPolicy参数包括:

1)SOURCE:注解将被编译器丢弃

2)CLASS:注解在class文件中可用,但会被VM丢弃

3)RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息

@Documented:将此注解包含在Javadoc中

@Inherited:允许子类继承父类中的注解

大多数时候,程序员主要是定义自己的注解,并编写自己的处理器来处理它们.

----------------------------- UseCase.java -------------------------

packagecom;

importjava.lang.annotation.ElementType;

importjava.lang.annotation.Retention;

importjava.lang.annotation.RetentionPolicy;

importjava.lang.annotation.Target;

@Target(ElementType.METHOD)//用来定义你的注解将应用在什么地方,本处应用为方法

//用来定义该注解在哪一个级别可用,在源代码中(source)类文件中(class)或者运行时(runtime)

@Retention(RetentionPolicy.RUNTIME)

public@interfaceUseCase {

publicintid();

publicString description()default"no description";

}

----------------------------- PasswordUtils .java -------------------------

packagecom;

publicclassPasswordUtils {

@UseCase(id=47,description="Passwords must contain at least one numeric")

publicbooleanvalidatePassword(){

returntrue;

}

@UseCase(id=48)

publicString encryptPassword(String password){

returnpassword;

}

@UseCase(id=49,description="Jong_Cai")

publicvoidshowName(){

System.out.println("Jong_Cai");

}

}

1-2:编写注解处理器

如果没有用来读取注解的工具,那注解也不会比注释更有用.使用注解的过程中.很重要的一个部

分就是创建与使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员构造这类工具.同时,它还提

供了一个外部工具apt帮助程序员解析带有注解的Java源代码.

下面是一个非常简单的注解处理器,我们将用它来读取PasswordUtils类,并使用反射机制查

找@UseCase标记.我们为其提供了一组id值得,然后它会列出在PasswordUtils中找到的用例,以及缺失的

用例.

------------------------ UseCaseTracker.java ---------------------------

packagecom;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

importjava.util.Collections;

importjava.util.List;

publicclassUseCaseTracker {

publicstaticvoidtrackUseCases(List list, Class> cl) {

for(Method m : cl.getDeclaredMethods()) {

UseCase us = m.getAnnotation(UseCase.class);

if(us !=null) {

System.out.println("Found Use Case:"+ us.id() +" "

+ us.description());

list.remove(newInteger(us.id()));

}

}

for(inti : list) {

System.out.println("Warning:Missing use case-"+ i);

}

}

publicstaticvoidmain(String[] args) {

List list =newArrayList();

Collections.addAll(list,47,48,49,50,51);

trackUseCases(list, PasswordUtils.class);

}

}

这个程序用到了两个反射的方法:getDeclaredMethods()和getAnnotation(),它们都属

于AnnotatedElement接口(class,Method与Field等类都实现了该接口).getAnnotation()方法返回指定类

型的注解对象,在这里就是UseCase,如果被注解的方法上没有该类型的注解,则返回null值.然后我们通过

调用id()和description()方法从返回的UseCase对象中提取元素的值.其中encryptPassword()方法在注

解的时候没有指定description的值,因此处理器在处理它对应的注解时,通过description()方法取得的

是默认值no description.

java 注解 对象_Java基础-学习使用Annotation注解对象相关推荐

  1. java 方法泛型_Java基础学习,什么是泛型概念,使用泛型有哪些好处?

    一般的类和方法,只能使用具体的类型,要么是基础数据类型,要么是自定义类. 如果要编写可以应用与多种类型的代码,这种刻板的限制对代码的束缚就会很大. 泛型的字面概念: 适合用于许多类型. 在面向对象中, ...

  2. java定义构造方法_JAVA基础学习之路(三)类定义及构造方法

    类的定义及使用 一,类的定义 classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intn ...

  3. java冰法_Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /*这是 * 一段注释, * 它跨越了多个行*/ public void ...

  4. java string类方法_Java基础学习——String类及其方法

    String类概述 该类被final修饰,无子类,不可被复写.创建的对象一旦初始化,其内容不可被改变. String类复写了Object类中的equals()定义了自己的独特内容,该方法用于判断字符串 ...

  5. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  6. java注解字段类型相同_《java基础学习之——重复注解》

    在某些情况下,您要将相同的注释应用于声明或类型使用.从JavaSE 8版本开始,重复注释使您能够做到这一点. 例如,您正在编写代码以使用定时服务,使您能够在给定时间或某个时间表运行方法,类似于UNIX ...

  7. java catch空指针异常处理_Java基础学习:java文件空指针异常处理

    在Java编程中,我们或多或少地会遇到一些程序异常的情况,为了不影响程序的正常执行,我们需要在程序发生异常的情况下,进行一些操作来防止造成更大的损失.例如在我们平时的除法运算中,被除数是不能为0的,如 ...

  8. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02

    1.权限修饰符和代码块 1.1 权限修饰符 权限修饰符:是用来控制一个成员能够被访问的范围的. 可以修饰:成员变量.方法.构造方法.内部类. 巧计举例: private--------私有的----- ...

  9. java三板斧_JAVA基础学习 三板斧

    JAVA基础学习 -1 三板斧 1. 引子 最近因为工作需要,开始学习JAVA,我之前常用的编程语言是C,C#,C++,基本没有用JAVA,JAVA需要从基础开始学习了. JAVA是从C++优化而来: ...

最新文章

  1. R语言nchar函数统计字符串中字符个数实战
  2. mysql update操作
  3. Struts1.x框架基本原理
  4. DevExpress的TreeList怎样设置数据源使其显示成单列树形结构
  5. label smoothing(标签平滑)
  6. centos下git clone报401错误解决办法
  7. mysql cluster 查看最大索引数_MySQL 数据库优化,看这篇就够了
  8. Java、JavaScript、C、C++、PHP、Python都是用来开发什么?赶紧来看看!
  9. C++ 工程实践(2):不要重载全局 ::operator new()
  10. 【转载】安装pip、pyinstaller并将py脚本打包成exe文件
  11. 杭电2540遮挡判断
  12. schema的详解2
  13. 计算机模拟超光速,超光速十代笔记本电脑怎么样-电脑测评
  14. Kubernetes Pod健康检查-livenessProbe和readinessProbe
  15. P1_C1-3:系统分析与设计概要
  16. 方差分析(ANOVA)分类、应用举例及matlab代码
  17. Spring 分组验证
  18. 入行大数据,需要学习哪些基础知识?
  19. 函数TEXT - EXCEL单元格中日期格式转换为文本格式
  20. nyoj 301递推求值 (矩阵+快速幂)

热门文章

  1. mysql删除记录后id不连续_小水玩转Mysql---Mysql跟踪sql记录
  2. deque用法深度解析,一篇文章弄懂deque容器各种操作
  3. OpenShift 之 用CodeReady Workspaces开发Quarkus云原生应用
  4. (九)把一切放在一起:用深度伪造换脸
  5. 边缘设备上的实时AI人员检测:在Raspberry Pi上启动SSD
  6. 在IIS上部署ASP.NET Core Web API
  7. 如何让fragment每次都重新加载_带上税控在哪都能开票,如何重新安装开票软件?...
  8. SSH2中 关于修改hbm.xml文件 中内容无效果的解决方式
  9. Angualr8 ViewChild报错
  10. dump命令linux,Linux shell dump 命令