java注解
与注释不同,注解是给程序看的,注释是给程序员看的。
作用
可以被其他程序读取,对程序作出解释
可以在package,class,method,field上面,相当于添加了额外的辅助信息,可以通过反射机制鞭策对这些元数据的访问。
内置注解
在java.lang.xxx中
//重写
@Override
//不推荐使用,过期
@Deprecated
//抑制警告
@SuppressWarnings
元注解
负责注解其他的注解,有四个元注解,分别是
//用于描述注解的使用范围,PACKAGE,TYPE,METHOD,FILED,CONSTRUCT。。。。。
@Target()
//在什么级别报错该注释信息,用于描述注解的生命周期
@Retention
(Source源码<class编译<runtime默认)
//注解将包含杂javadoc中
@Doucument
//说明子类可以继承父类中的注解
@Inherited
注解的定义
注解通过 @interface 关键字进行定义。
自动继承java.lang.annotation.Annotation接口
public @interface TestAnnoation {
定义内容
}
public @interface TestAnnoation {
// 注解的属性也叫做成员变量,不是方法而是参数 类型 参数名
// default 默认值 如果-1表示不存在
int id() default 1;
String msg(); // 注解的成员变量
}
调用自定义注解
@TestAnnoation(id = 0, msg = "")
public class Test extends Object {
@Override
public String toString() {
return super.toString();
}
// 不推荐使用
@Deprecated
public static void test() {
System.out.println("Deprecated");
}
// 抑制警告
@SuppressWarnings("all")
public void test02() {
List list = new ArrayList<>();
}
public static void main(String[] args) {
test();
}
}
利用注解和反射完成类和表的映射关系
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 通过反射获取注解
*
*
* 映射User类
*
* @author zwm
*
*/
public class ReflectionDemo11 {
public static void main(String[] args) throws ClassNotFoundException {
Class class1 = Class.forName("User2");
// 通过反射获取注解
Annotation[] annotations = class1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
// 获取注解的值
table table = (table) class1.getAnnotation(table.class);
String value = table.value();
System.out.println(value);
// 获取类属性的值
filed filed = (filed) class1.getAnnotation(filed.class);
System.out.println(filed.columnName());
System.out.println(filed.length());
System.out.println(filed.type());
}
}
@table("db_user")
class User2 {
@filed(columnName = "name", type = "varchar", length = 10)
private String name;
@filed(columnName = "age", type = "int", length = 10)
private int age;
public User2() {
super();
// TODO Auto-generated constructor stub
}
public User2(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User2 [name=" + name + ", age=" + age + "]";
}
}
//类注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface table {
// 表名
String value();
}
//属性、字段注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface filed {
String columnName();
String type();
int length();
}