Java注解概述
Java 注解可以理解为元数据,所谓元数据即是描述数据的数据,如我们平时用的hibernate,就可以注解的方式描述model信息:
@Entity
@Table(name="teams")
public class Team {
@Id
@GeneratedValue
private Integer id;
@Column(nullable = false)
private String name;
private Integer rating;
}
通过注解,指定实体类Team与teams 呈映射关系,并且id为表的主键,表中name列不能为null。这些也可以通过xml文件配置,那么相比于xml文件,两者有什么区别吗?举一个例子,我们使用SpringMVC开发WebApp的时候,常有一个application.xml文件,配置sessionFactory,transactionManager这些通用的组件,这部分组件不和任何特定的代码相关联;而一些Controller,Service,则通过注解(@Conroller,@Service)的形式配置,因为这部分代码与注解中的信息紧密耦合,这增强了代码的可读性。
自定义注解是比较简单的,与定义接口非常类似:
如上面@Column的定义:
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Column {
String name() default "";
boolean unique() default false;
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String table() default "";
int length() default 255;
int precision() default 0;
int scale() default 0;
}
自定义注解需要使用以下注解:
@Documented – 表示在生产 JavaDoc 文档的时候把注解信息也包含进去
@Retention – 表示该注解的级别。可选的范围有:
SOURCE : 只在源代码里出现,编译后就被丢弃了,如@Override, @SuppressWarnings
CLASS : 会被编译到 class 文件里。
RUNTIME : 在 JVM 加载 class 文件的时候,也会把注解的信息加载进去,
可用于运行时反射,自定义注解时常用的级别。
@Target – 表示该注解的作用位置
@Inherited – 表示子类运行继承父类的注解。
记住,注解仅仅是元数据(为类,方法,字段,包提供信息),它本身并不包含任何的业务逻辑,通常另有一块代码来读取注解中的信息,处理相应的业务逻辑。
请看示例:
注解的定义:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TInfo {
String fieldName() default "";
}
注解的使用:
public class Item {
private int id;
@TInfo(fieldName="商品名称")
private String name;
@TInfo(fieldName="商品数据")
private int count;
}
注解的处理类(需要使用反射):
public class Consumer {
public static void annoInfo(Class<?> clazz){
Field[] fields = clazz.getDeclaredFields();// 得到指定类的所有属性Field.
// 打印注解信息
for (Field field : fields) {
if (field.isAnnotationPresent( TInfo.class)) {
System.out.println(field
.getAnnotation(TInfo.class).fieldName());
}
}
}
public static void main(String[] args){
annoInfo(Item.class);
}
}
- Java枚举类型的原理
- 厚土Go学习笔记 | 27. 斐波纳契闭包
- 代码审计| APPCMS SQL-XSS-CSRF-SHELL
- 厚土Go学习笔记 | 33. 利用数据流实现密码代换功能
- 厚土Go学习笔记 | 32. Readers读取数据流
- GoStub框架二次开发实践
- 厚土Go学习笔记 | 31. 错误 通常函数会返回一个error值来判断是否出错
- 厚土Go学习笔记 | 30. Stringers的一个练习
- 黑客游戏| Owasp juice shop (一)
- 厚土Go学习笔记 | 29. 接口
- Golang中Interface类型详解
- 反序列化| 我欲修仙,法力无边。
- Go语言的网络编程简介
- golang基于redis lua封装的优先级去重队列
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Codeforces Round #624 (Div. 3) B - WeirdSort
- 详解 Ajax
- 这个腾讯博客是被腾讯爬虫爬过来的,样式丑,请看我博客园地址,见下文
- Codeforces Round #624 (Div. 3) C - Perform the Combo
- 都是微服务的天下了,还有不知道 JSON 的程序员吗?
- Codeforces Round #624 (Div. 3) D.Three Integers
- select 高级查询之连接查询
- select 高级查询之子查询
- Java 最实用的文件读写
- MySQL基本操作
- MySQL 索引
- notepad++ 配置c++及运行
- Leetcode 687. 最长同值路径
- Leetcode 1071. 字符串的最大公因子
- PAT (Advanced Level) Practice 1146 Topological Order (25分)