1.自定义注解,先自定义三个水果属性的注解
元注解:
java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target –注解用于什么地方
@Inherited – 是否允许子类继承该注解
1.)@Retention– 定义该注解的生命周期
● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
● RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
● RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
2.)Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
● ElementType.CONSTRUCTOR:用于描述构造器
● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
● ElementType.LOCAL_VARIABLE:用于描述局部变量
● ElementType.METHOD:用于描述方法
● ElementType.PACKAGE:用于描述包
● ElementType.PARAMETER:用于描述参数
● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
3.)@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。
4.)@Inherited – 定义该注释和子类的关系
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
//定义水果颜色注解 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitColor { /** * 颜色枚举 */ public enum Color {BULE,RED,GREEN}; //默认值是GREEN Color fruitColor() default Color.GREEN; } //定义水果名字注解 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitName { //若注解属性是单个,默认命名为value,“”和-1都代表没有值 String value() default ""; } //定义说果供应商注解 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitProvider { int id() default -1; String name() default ""; String address() default ""; }
2 .使用注解
1 public class Fruit { 2 3 @FruitName(value = "Apple") 4 private String fruitName; 5 6 @FruitColor 7 private String fruitColor; 8 9 @FruitProvider(id=1,name = "陕西红富士",address = "陕西延安") 10 private String fruitProvider; 11 12 13 public String getFruitName() { 14 return fruitName; 15 } 16 17 public void setFruitName(String fruitName) { 18 this.fruitName = fruitName; 19 } 20 21 public String getFruitColor() { 22 return fruitColor; 23 } 24 25 public void setFruitColor(String fruitColor) { 26 this.fruitColor = fruitColor; 27 } 28 29 public String getFruitProvider() { 30 return fruitProvider; 31 } 32 33 public void setFruitProvider(String fruitProvider) { 34 this.fruitProvider = fruitProvider; 35 } 36 }
3.解析注解
@RunWith(SpringRunner.class) @SpringBootConfiguration @SpringBootTest(classes = Application.class) public class FruitTest { public static void main(String[] args) { AnnotationUtil.getFruitInfo(Fruit.class); } } /** * @author GuanBin * @version AnnotationUtil.java, v1 2018/4/23 下午11:54 GuanBin Exp $$ */ public class AnnotationUtil { public static void getFruitInfo(Class<?> clazz) { //获取一个类中的属性 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) {
if (field.isAnnotationPresent(FruitName.class)) { FruitName annotation = field.getAnnotation(FruitName.class); System.out.println("水果名称" + annotation.value() + " "); } else if (field.isAnnotationPresent(FruitColor.class)) { FruitColor annotation = field.getAnnotation(FruitColor.class); System.out.println(annotation.fruitColor().toString() + " "); } else if (field.isAnnotationPresent(FruitProvider.class)) { FruitProvider annotation = field.getAnnotation(FruitProvider.class); System.out .println("供货商id是" + annotation.id() + " 名称是" + annotation.name() + "地址是:" + annotation.address()); } } } }
参考: