1.注解相关概念
注解(Annotation)是代码里的特殊标记,程序可以读取注解,一般用于替代配置文件。
可以通过反射技术得到类的注解,以控制类的运行方式。
创建注解使用@interface关键字,注解中只能包含属性。
注解的属性可以使用的类型:字符串、基本数字类型、Class、Enum、Annotation,以上类型的一维数组。
2.创建注解
1 package com.example.anno; 2 3 public @interface MyAnnotation { 4 //只能包含属性 5 String name(); 6 7 int age() default 18; 8 }
1 package com.example.anno; 2 3 import com.example.eum.Gender; 4 5 public @interface MyAnnotation2 { 6 String value(); 7 8 int num() default 2; 9 10 // Class<?> class1(); 11 // 12 // Gender gender(); 13 // 14 // MyAnnotation anno1(); 15 }
1 package com.example.anno; 2 3 //注解写在类上 4 @MyAnnotation(name = "张三", age = 20) 5 public class Person { 6 7 //注解写在方法上,使用默认值 8 @MyAnnotation(name = "张三") 9 public void show() { 10 11 } 12 13 @MyAnnotation2(value="鸡肉") 14 public void eat() { 15 16 } 17 }
注解的本质是一个继承了Annotation的interface,注解的属性会被转换为方法。
3.使用反射获取注解信息
1 package com.example.anno; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 //元注解, 9 //@Retention(RetentionPolicy.CLASS)// 默认,运行的时候注解就不存在了 10 @Retention(RetentionPolicy.RUNTIME) // jvm级别 11 //@Retention(RetentionPolicy.SOURCE) // 编译时直接丢弃 12 13 @Target(value = { 14 ElementType.ANNOTATION_TYPE, 15 ElementType.CONSTRUCTOR, 16 ElementType.FIELD, 17 ElementType.LOCAL_VARIABLE, 18 ElementType.METHOD, 19 ElementType.PACKAGE, 20 ElementType.TYPE, 21 ElementType.TYPE_PARAMETER, 22 ElementType.TYPE_USE }) 23 24 public @interface PersonInfo { 25 String name(); 26 27 int age(); 28 29 String sex(); 30 }
1 package com.example.anno; 2 3 //注解写在类上 4 @MyAnnotation(name = "张三", age = 20) 5 public class Person { 6 7 // 注解写在方法上,使用默认值 8 @MyAnnotation(name = "张三") 9 public void show() { 10 11 } 12 13 @MyAnnotation2(value = "鸡肉") 14 public void eat() { 15 16 } 17 18 @PersonInfo(name = "张三", age = 20, sex = "男") 19 public void show(String name, int age, String sex) { 20 System.out.println(name + "--" + age + "--" + sex); 21 } 22 }
1 package com.example.anno; 2 3 import java.lang.annotation.Annotation; 4 import java.lang.reflect.Method; 5 6 public class Demo { 7 8 public static void main(String[] args) throws Exception { 9 // TODO Auto-generated method stub 10 Class<?> cp = Class.forName("com.example.anno.Person"); 11 Method m = cp.getMethod("show", String.class, int.class, String.class); 12 PersonInfo pi = m.getAnnotation(PersonInfo.class); 13 System.out.println(pi.name() + "--" + pi.age() + "--" + pi.sex()); 14 15 Person p = (Person) cp.newInstance(); 16 m.invoke(p, pi.name(), pi.age(), pi.sex()); 17 } 18 }