java 注解 对象_Java基础-学习使用Annotation注解对象
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注解对象相关推荐
- java 方法泛型_Java基础学习,什么是泛型概念,使用泛型有哪些好处?
一般的类和方法,只能使用具体的类型,要么是基础数据类型,要么是自定义类. 如果要编写可以应用与多种类型的代码,这种刻板的限制对代码的束缚就会很大. 泛型的字面概念: 适合用于许多类型. 在面向对象中, ...
- java定义构造方法_JAVA基础学习之路(三)类定义及构造方法
类的定义及使用 一,类的定义 classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intn ...
- java冰法_Java基础学习笔记二 Java基础语法
注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /*这是 * 一段注释, * 它跨越了多个行*/ public void ...
- java string类方法_Java基础学习——String类及其方法
String类概述 该类被final修饰,无子类,不可被复写.创建的对象一旦初始化,其内容不可被改变. String类复写了Object类中的equals()定义了自己的独特内容,该方法用于判断字符串 ...
- java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...
学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...
- java注解字段类型相同_《java基础学习之——重复注解》
在某些情况下,您要将相同的注释应用于声明或类型使用.从JavaSE 8版本开始,重复注释使您能够做到这一点. 例如,您正在编写代码以使用定时服务,使您能够在给定时间或某个时间表运行方法,类似于UNIX ...
- java catch空指针异常处理_Java基础学习:java文件空指针异常处理
在Java编程中,我们或多或少地会遇到一些程序异常的情况,为了不影响程序的正常执行,我们需要在程序发生异常的情况下,进行一些操作来防止造成更大的损失.例如在我们平时的除法运算中,被除数是不能为0的,如 ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02
1.权限修饰符和代码块 1.1 权限修饰符 权限修饰符:是用来控制一个成员能够被访问的范围的. 可以修饰:成员变量.方法.构造方法.内部类. 巧计举例: private--------私有的----- ...
- java三板斧_JAVA基础学习 三板斧
JAVA基础学习 -1 三板斧 1. 引子 最近因为工作需要,开始学习JAVA,我之前常用的编程语言是C,C#,C++,基本没有用JAVA,JAVA需要从基础开始学习了. JAVA是从C++优化而来: ...
最新文章
- R语言nchar函数统计字符串中字符个数实战
- mysql update操作
- Struts1.x框架基本原理
- DevExpress的TreeList怎样设置数据源使其显示成单列树形结构
- label smoothing(标签平滑)
- centos下git clone报401错误解决办法
- mysql cluster 查看最大索引数_MySQL 数据库优化,看这篇就够了
- Java、JavaScript、C、C++、PHP、Python都是用来开发什么?赶紧来看看!
- C++ 工程实践(2):不要重载全局 ::operator new()
- 【转载】安装pip、pyinstaller并将py脚本打包成exe文件
- 杭电2540遮挡判断
- schema的详解2
- 计算机模拟超光速,超光速十代笔记本电脑怎么样-电脑测评
- Kubernetes Pod健康检查-livenessProbe和readinessProbe
- P1_C1-3:系统分析与设计概要
- 方差分析(ANOVA)分类、应用举例及matlab代码
- Spring 分组验证
- 入行大数据,需要学习哪些基础知识?
- 函数TEXT - EXCEL单元格中日期格式转换为文本格式
- nyoj 301递推求值 (矩阵+快速幂)
热门文章
- mysql删除记录后id不连续_小水玩转Mysql---Mysql跟踪sql记录
- deque用法深度解析,一篇文章弄懂deque容器各种操作
- OpenShift 之 用CodeReady Workspaces开发Quarkus云原生应用
- (九)把一切放在一起:用深度伪造换脸
- 边缘设备上的实时AI人员检测:在Raspberry Pi上启动SSD
- 在IIS上部署ASP.NET Core Web API
- 如何让fragment每次都重新加载_带上税控在哪都能开票,如何重新安装开票软件?...
- SSH2中 关于修改hbm.xml文件 中内容无效果的解决方式
- Angualr8 ViewChild报错
- dump命令linux,Linux shell dump 命令