package com.design.design_note.spring; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 用于描述注解的注解的使用范围,就是被描述的注解能用在什么地方 /** * 取值(ElementType)有: * 1.CONSTRUCTOR:用于描述构造器 * 2.FIELD:用于描述域 * 3.LOCAL_VARIABLE:用于描述局部变量 * 4.METHOD:用于描述方法 * 5.PACKAGE:用于描述包 * 6.PARAMETER:用于描述参数 * 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明 */ @Target(ElementType.METHOD) /** * 用来定义注解的保留时间 * 表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效) * 取值(RetentionPoicy)有: * 1.SOURCE:在源文件中有效(即源文件保留) * 2.CLASS:在class文件中有效(即class保留) * 3.RUNTIME:在运行时有效(即运行时保留) * * Product注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理 */ @Retention(RetentionPolicy.RUNTIME) public @interface Product { public int id(); public String name(); public String value(); }
// 注解使用的地方
package com.design.design_note.spring; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; // 设计我们的售卖机 public class SelfService { @Product(id=1,name = "apple",value = "3.12/公斤") public void sellApple(){}; @Product(id=2,name="banana" ,value="2.99/公斤") public void sellBanana(){ } }
// 测试注解的地方
package com.design.design_note.spring; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /** * java 的注解以及自定义注解 */ public class TestNote { //java 反射 static Map<Integer,Product> ProductMap = null; // 静态代码块 static { ProductMap = new HashMap<Integer,Product>(); for(Method m:SelfService.class.getDeclaredMethods()){ Product p = m.getAnnotation(Product.class); if (p != null) { ProductMap.put(p.id(), p); } } } // 静态方法 public static void selfsell(int i){ Product p = ProductMap.get(i); if(p!=null){ System.out.println("sell product: id=" + p.id() + " name=" + p.name() + " value=" + p.value() ); } } public static void main(String[] args) { selfsell(1); } }