注解(也称元数据)

三种标准注解

@Override 表示当前方法覆盖超类中的方法
@Deprecated 使用注解为这个的元素,编译器会发出警告
@SuppressWarnings 关闭不当编译器警告信息

20.1 基本语法

20.1.1 定义注解

package Ch20;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//元注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
//很像接口定义,但可以在内部定义元素。没有定义元素的称为标记注解。
public @interface Test {}

20.1.2 元注解

@Target 表示注解可以的地方
@Retentioin 表示需要神秘级别保存该注解信息
@Documented 将注解包含在Javadoc中
@Inherited 允许子类继承父类中的注解

20.2 编写注解处理器

没有注解处理器,注解和注释一样。

/*定义注解********************************************************/
package Ch20;import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)public @interface UseCase {//注解的元素看起来像接口方法。区别在于可以添加默认值public int id();public String description() default  "no description";
}/*使用注解*********************************************************/package Ch20;
import java.util.*;public class PasswordUtils {//可以看到元素并不是方法那样定义,而是直接当变量使用。@UseCase(id = 47, description = "Passwords must contain at least one numeric")public boolean validatePassword(String password){return (password.matches("\\w*\\d\\w*"));}@UseCase(id = 48)public boolean encryptPassword(String password) {return (password.matches("\\w*\\d\\w*"));}@UseCase(id =49, description = "New passwords can't equal previouslu used ones")public boolean checkForNewPassword(List<String> prevPasswords, String password){return !prevPasswords.contains(password);}}/*注解处理器***************************************************/
package Ch20;//import java.lang.reflect.Method;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class UseCaseTracker {public static void trackUseCases(List<Integer> useCases, Class<?> cl) {for(Method m : cl.getDeclaredMethods()){//getAnnotation(Class)指定返回的注解类型的对象。没有返回nullUseCase uc = m.getAnnotation(UseCase.class);if(uc != null){System.out.println("Found Use Case: "+uc.id()+" "+uc.description());useCases.remove(new Integer(uc.id()));}}for(int i : useCases){System.out.println("Warning: Missing use case-"+i);}}public static void main(String[] args) {List<Integer> useCases = new ArrayList<>();Collections.addAll(useCases,47,48,49,50);trackUseCases(useCases,PasswordUtils.class);}
}/*Found Use Case: 47 Passwords must contain at least one numeric
Found Use Case: 48 no description
Found Use Case: 49 New passwords can't equal previouslu used ones
Warning: Missing use case-50*/

20.2.1 注解元素

注解元素可用的类型如下:

所有基本类型
String
Class
enum
Annotation
以上类型的数组

注解也可以嵌套

20.2.2 默认值限制

元素不能有不确定的值。

对于非基本类型的元素,不能以null作为其值。这个限制使得表现元素缺失或存在状态很难。

package Ch20;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {public int id() default -1;public String description() default "";
}

20.2.3 生产外部文件

Java编程思想 Ch20 注解相关推荐

  1. 【java】《java编程思想》 读书笔记

    之前主要用的C++的比较多,之前花了快2个月的实际认真系统全面的学习了以下java的基础语法,<java编程思想>这本书翻译水平确实不是很好,很多话读着会比较拗口.推荐读之前,先去网上搜索 ...

  2. java编程思想--概述

    之前主要用的C++的比较多,之前花了快2个月的实际认真系统全面的学习了以下java的基础语法,<java编程思想>这本书翻译水平确实不是很好,很多话读着会比较拗口.推荐读之前,先去网上搜索 ...

  3. java编程思想怎么样_读完java编程思想后的思考?

    谢邀,这本书真的给我带来很多思考. 我的java入门不是java编程思想,学校的教材是一本紫色的书,已经忘了叫什么名字了,里面内容倒挺新还讲了些javafx.但那本书实在是太浅并且结构混乱,以至于我和 ...

  4. 【Java编程思想】读书笔记(二)第六章---第十章

    Java编程思想(第四版)学习笔记 第六章---第十章 第六章:访问权限控制 6.2Java访问权限修饰词 第七章:复用类 7.1 组合语法 7.2 继承语法(extends) 7.4.2名称屏蔽(重 ...

  5. 《Java编程思想》读书笔记

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十八章的内容,这一次 ...

  6. 《JAVA编程思想》学习笔记:第8章(多态)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  7. 《JAVA编程思想》学习笔记:第16章(数组)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  8. Java编程思想日志

    Thinking In Java的作者是大牛!做事要站在巨人的肩膀上有助于提高效率和开阔眼界!建议学习java的小伙伴儿有时间可以抽空了解一下,以下内容为读书笔记,比较杂乱,仅供参考,推荐阅读原著: ...

  9. Java编程思想翻译勘误

    总的来说,Java编程思想是一本好书:但是因为译者可能不懂计算机,很多地方都有严重错误. 之前和朋友抱怨过,朋友提议抱怨无用不如干点实事.遂决定边看边将自己找到的翻译错误贴出来,希望能给别人一些帮助. ...

最新文章

  1. linux驱动由浅入深系列链接
  2. 带你看明白class二进制文件!
  3. 实用计算机相关日语词汇,常用日语计算机词汇~~
  4. linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝
  5. python黑网站_Python简单实现HTTP本地代理转发
  6. 3-3 修改haproxy配置文件
  7. OpenMV常用函数整理
  8. python 如何封装成so_python打包成so文件
  9. camera主观测试_镜头测试:日本富士EBC 135/2.5+索尼A7微单实拍北京北海公园
  10. 转载Prince_vegeta制作的VC知识库1-53期合订本索引文件。
  11. 修改tomcat日志数据路径
  12. PostgreSql扩展(EXTENSION )
  13. 转自国学大师--南怀谨先生
  14. Vertica中的projections
  15. 硅树脂油漆申请美国标准UL 790 Class A 合适吗?
  16. 机械硬盘速度测试软件用哪个,比机械硬盘快多少? SSD测量了常用软件和应用速度...
  17. Spring常见面试题55道(附答案2023最新版)
  18. python小组项目总结报告_项目总结报告范文78922
  19. Word无法插入两个目录解决方法
  20. 网络安全工程师需具备的5个重要技能

热门文章

  1. BUUCTF:[RoarCTF2019]黄金6年
  2. form.vue 选择性打印
  3. CAD线条颜色与图层默认颜色不符
  4. 不翻qiang搞定Android Studio Google库加载不下来的问题 打包生成apk android studio 3.2打灰机程序源码带详细注释
  5. bzoj3118 Orz the MST
  6. 数据库事务四大特性(ACID)
  7. 快速拿捏CSS中的常用的元素属性
  8. 谈编码与Unicode标准
  9. 离散型概率分布之一——二项分布
  10. cmd配网关_CMD命令行下修改网络IP设置的方法