起来看一下Java中的Annotation注解
- 一. 什么是Annotation
- 二. Annotation的作用
- 2.1 编译器使用到的注解
- 2.2 .class文件使用到的注解
- 2.3 运行期读取的注解
- 三. 定义Annotation
- 3.1 元注解
- 3.2 定义注解小结
- 四. Annotation处理
- 五. 总结
一. 什么是Annotation
二. Annotation的作用
2.1 编译器使用到的注解
2.2 .class文件使用到的注解
2.3 运行期读取的注解
三. 定义Annotation
1
|
/** * 定义一个Table注解 */ public @interface Table { String value() default "" ;} /** * 定义一个Colum注解 */ public @interface Colum { String value() default "" ; String name() default "" ; String dictType() default "" ;}
|
3.1 元注解
3.1.1 @Target
public @interface Target { /** * Returns an array of the kinds of elements an annotation type * can be applied to. * @return an array of the kinds of elements an annotation type * can be applied to */ ElementType[] value();}
public enum ElementType { /** 通过ElementType.TYPE可以修饰类、接口、枚举 */ TYPE, /** 通过ElementType.FIELD可以修饰类属性 */ FIELD, /** 通过ElementType.METHOD可以修饰方法 */ METHOD, /** 通过ElementType.PARAMETER可以修饰参数(如构造器或者方法中的) */ PARAMETER, /** 通过ElementType.CONSTRUCTOR可以修改构造器 */ CONSTRUCTOR, /** 通过ElementType.LOCAL_VARIABLE可以修饰方法内部的局部变量 */ LOCAL_VARIABLE, /** 通过ElementType.ANNOTATION_TYPE可以修饰注解 */ ANNOTATION_TYPE, /** 通过ElementType.PACKAGE可以修饰包 */ PACKAGE, /** * 可以用在Type的声明式前 * * @since 1.8 */ TYPE_PARAMETER, /** * 可以用在所有使用Type的地方(如泛型、类型转换等) * * @since 1.8 */ TYPE_USE}
@Target(ElementType.PACKAGE)public @interface Table { String value() default "";}
@Tablepackage annotation;class PackageInfo { public void hello() { System.out.println("hello"); }}
@Target(ElementType.TYPE_USE)public @interface NoneEmpty { String value() default "";}@Target(ElementType.TYPE_PARAMETER)public @interface NoneBlank { String value() default "";}
3.1.2 @Retention
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interfaceRetention { /** * Returns the retention policy. * @return the retention policy */ RetentionPolicy value();}public enum RetentionPolicy { /** * 仅存在于源代码中,编译阶段会被丢弃,不会包含于class字节码文件中. */ SOURCE, /** * 【默认策略】,在class字节码文件中存在,在类加载的时被丢弃,运行时无法获取到 */ CLASS, /** * 始终不会丢弃,可以使用反射获得该注解的信息。自定义的注解最常用的使用方式。 */ RUNTIME}3.1.3 @Documented
3.1.4 @Inherited
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface Person { String value() default "man";}@Personpublic class Parent {}//子类也拥有@Person注解class Son extends Parent {}3.2 定义注解小结
四. Annotation处理
//定义的注解@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Colum { String value() default ""; //用于表示某个属性代表的中文含义 String name() default "";}
public class Person { @Colum(name = "姓名") private String name; @Colum(name = "性别") private String gender; @Colum(name = "年龄") private int age; @Colum(name = "住址") private String address; public String getName() {return name;} public void setName(String name) {this.name = name;} public String getGender() {return gender;} public void setGender(String gender) {this.gender = gender;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;}}
public static void main(String[] args) throws ClassNotFoundException { List<String> columNames = new ArrayList<>(); Class clazz = Class.forName("annotation.Person"); //获取Person类所有属性 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields){ //获取该属性的Colum注解 Colum colum = field.getAnnotation(Colum.class); //或者可以先判断有无该注解 field.isAnnotationPresent(Colum.class); //将该属性通过注解配置好的中文含义取出来放到集合中 columNames.add(colum.name()); } //打印集合 columNames.forEach((columName) -> System.out.println(columName));}
姓名性别年龄住址
五. 总结