注解
注解概述
- 注解主要起到标识作用,是JDK5.0提出的,Java增加对元数据的支持,也就是Annotation(注解)。
- 引用Annotation的概念来描述元数据
什么是元数据
- 元数据是用来描述数据的数据,通俗一点来说,就是描述代码间的关系,或者代码与
其他资源(数据库)之间内在联系的数据。 - 举例:struts来说,元数据指的就是struts-config.xml;对hibernate来说就是hbm文件;
- 如何创建元数据?
- JDK5.0出来后,Java语言提出了四种类型:类(class)、枚举(enum)、接口(interface)和注解(@interface),它们处在用一个级别。Java就是通过注解来表示元数据的。
常用三个基本注解
- @Override:限定重写父类的方法,该注解只能用于方法
- @Deprecated:用于表示某个程序中元素(类、方法等)已过时
- @SupperessWarnings:抑制编译器警告
- @SuppressWarnings(“抑制的警告的具体类型”):
- @unused:变量未使用
- @deprecation:使用了不赞成使用的类或方法时的警告
- @unchecked:执行了未检查的转换时的警告。比如没有使用泛型
- @falthrough:当switch程序块直接通往下一种情况而没有break时的警告
- @path:在类路径、源文件路径等中有不存在的路径时的警告。
- @serial:当在可序列化雷尚缺少serialVersionUID定义时的警告
- @finally:任何finally子句不能正常完成时的警告。
- @all:关于以上所有情况的警告。
public class IPLMThread implements Runnable{
@Override
public void run() {
System.out.println("Hello");
}
public void run(String name) {
System.out.println("Hello");
}
}
注解分类
(1)按照运行机制划分:
源码注解:只在源码中存在,编译成.class文件就不存在了。
编译时注解:在源码和.class文件中都存在,像@Override、@Deprecated,他们都属于编译时注解。
运行时注解:在运行阶段才起作用,甚至会影响运行逻辑的注解。象@Autowired自动注入属于运行时
注解,会在运行阶段将你的成员变量自动的注入进来。
(2)按照来源划分
来自JDK的注解
来自第三方的注解
自定义的注解
(3)元注解
元注解就是给注解进行注解,可以理解位注解的注解就是元注解。
@Retention:说明该注解的生命周期
RententionPolicy.CLASS:指注解只保留一个class文件中
RententionPolicy.SOURCE:指定注解只保留在一个源文件中
RententionPolicy.RUNTIME:指定注解可以保留在程序运行期间
@Documented:文档注解
@Inherited:被他修饰的注解将具有继承性,如果某个类使用被该注解修饰的注解,则它的子类将自动具有该注解。
@Target: 作用域
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前。
自定义注解
语法格式 @interface
1.成员类型受限,合法类型 基本数据类型,String,Class Annotation,等
2.如何注解只有一个成员,则成员名必须为value(),在使用时候可以忽略成员名和赋值号(=)
3.注解类可以没有成员,没有成员注解称为标识注解
注解按照是否有值可以分为三类,分别是 标记注解 、 单值注解 、 完全注解 。
@Target(value={ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Field {
String columnName();
String type();
int length();
}
@Table("tb_student")
public class Student {
@Field(columnName="id",type="int",length=10)
private int id;
@Field(columnName="sname",type="varchar",length=10)
private String studentName;
@Field(columnName="age",type="int",length=3)
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}