注解
注解
注解即是元数据,就是源代码的元数据.
在Java语法中,使用@符号作为开头,后面紧跟注解名,用作于类,接口,方法,字段之上>例:@Override 复写父类方法注解
Java三大内置注解
@Override ; 表示当前的方法定义将覆盖父类中的方法,如果出现错误,编辑器报错.
@Deprecated; 如果使用次注解,编译器会出现警告信息(标示已过时)
@SuppressWarning(); 抑制编译器的警告信息 unchecked表示:执行了未检查的转换
元注解
自定义注解的时候使用的注解.(修饰其他注解的定义)
Java定义的4个元注解
@Targt
该元注解说明了Annotation(注解)所修饰的对象范围.(被描述的注解可以用在什么地方).
取值范围有:
类型 用途
CONSTRUCTOR 用于描述构造器
FIELD 用于描述字段
LOCAL_VARIABLE 用于描述局部变量
METHOD 用于描述方法
PACKAGE 用于描述包
PARAMETER 用于描述参数
TYPE 用于描述类、接口(包括注解类型) 或enum声明
例:(该注解只能在方法中使用)
@Target(ElementType.METHOD)
public @interface myAnnotation{
}
@Retentoin
该元注解定义了Annotation(注解)被保留的时间长短,表示需要在什么级别保存该注释信息,用于描述注解的生命周期(什么范围内有效);指定该注解可以使用反射读取.
取值范围有:
类型 说明
SOURCE 在源代码中有效(仅出现在源代码中,而被编译器丢弃)
CLASS 在class文件中有效,(被编译在Class文件中) 类加载
RUNTIME 在运行时有效(编译在Class文件中)
例:
/***
* 字段注解接口
*/
@Target(value = {ElementType.FIELD})//注解可以被添加在属性上
@Retention(value = RetentionPolicy.RUNTIME)
//注解保存在JVM运行时刻,能够在运行时刻通过反射API来获取到注解的信息
public @interface Column {
String name();//注解的name属性
}
@Documented
将注解包含在javadoc中,可以使用JavaDoc提取为文档
@Inherited
指定该修饰的注解具有继承性
自定义注解
格式:
public @interface 注解名{
//成员变量:注解中以无参的方法来声明成员变量
返回值类型 方法名();
返回值类型 方法名() default 默认值;
}
规则:
修饰符中只能是public 或 默认(default)
参数成员只能用基本数据类型和String,Enum,Class,annotations及这些类型的数组
如果只有一个参数成员,最好将名称设为”value”
注解元素必须有确定的值,可以在注解中定义默认值,也可以使用直接时指定,非基本类型的值不可为null,常使用空字符串或0作默认值
在表现一个元素存在或缺失的状态时,定义一下特殊值来表示,如空字符串或负值.
自定义注解的使用:
自定义注解:
import java.lang.annotation.*; @Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) @Retention(value = RetentionPolicy.RUNTIME) @Documented public @interface Table { String value(); }
测试实体类
@Table("city") public class CityEntity { @Table("idTable") public Integer id; @Table("nameTable") public String name; @Table("getIdMethod") public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
模拟获取类、方法、字段注解信息内容
import java.lang.reflect.Field; import java.lang.reflect.Method; public class SqlUtils { public static String getSelectSql(Object obj) throws NoSuchMethodException { StringBuilder sb = new StringBuilder(); sb.append("SELECT * FROM "); Class<?> aClass = obj.getClass(); //判断是否加了注解 if(aClass.isAnnotationPresent(Table.class)){ //获取类注解信息 Table annotation = aClass.getAnnotation(Table.class); //调用方法 sb.append(annotation.value()); } //获取字段注解信息 Field[] fields = obj.getClass().getFields(); for (Field field : fields) { sb.append("------"); Table annotation = field.getAnnotation(Table.class); sb.append(annotation.value()); } //获取方法注解信息 Method getId = obj.getClass().getMethod("getId", null); Table annotation = getId.getAnnotation(Table.class); sb.append("------"); sb.append(annotation.value()); return sb.toString(); } }
测试结果
public class test { public static void main(String args[]) throws NoSuchMethodException { CityEntity cityEntity = new CityEntity(); String selectSql = SqlUtils.getSelectSql(cityEntity); System.out.println(selectSql); } } //打印结果: SELECT * FROM city------idTable------nameTable------getIdMethod