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);
}
}