@RequestMapping("/addActivity.ajax")@ResponseBodypubli void addActivity(Activity activity){}
这是spring mvc Controller 中的注解 意思是下面的方法(addActivity)处理addActivity.ajax的请求,不止是spring mvc,在整个spring 体系中,包括其他框架中都有大量用到注解,那我们现在来了解下注解的知识.
注解的建立
快捷键 Ctrl+N 选择Annoation
元注解
1.
2.@Retention, 3.@Documented, 4.@Inherited这是Java的四个元注解,可以用来修饰我们自己定义的注解,也可以理解成注解的注解,
,@Retention比较常见
@Retention
这个注解表明会被保留到哪个阶段. 有三个值:
RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略 RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略 RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他 使用反射机制的代码所读取和使用.一般我们用到自定义注解的时候都会用到反射,所以创建字自定义注解时一般设置成RUNTIME级别
如果没设置@Retention 则默认为 RetentionPolicy.CLASS。
@Target
用于描述注解的使用范围(可以作用于java的那个部分,比如修饰变量的注解是不能修饰方法的,注解可以修饰什么地方就是由@Target决定的)
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参数 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TargetField { public String desc() default "这个注解修饰作用类里面的域变量";}
public class Targetdesc { @TargetField(desc="实例变量") private String classparam; @TargetField(desc="静态变量也可以") private static int age; @TargetConstructor(desc="构造函数") public Targetdesc() { // TODO Auto-generated constructor stub } public static void fun1(@TargetParameter(desc="方法参数一") String param){ @TargetLocal_variable(desc="方法内部变量") String local_variable = ""; } @TargetMethod(desc="方法") public void fun2(){ /*@TargetField(desc="静态变量也可以") TargetField 不能修饰方法内部变量*/ String local_variable = ""; } }
注解也可以修饰多个地方
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD})
注解处理器
回到最前面的例子,后台接收到addActivity.ajax请求后会调用addActivity方法,那我们是不是首先得取到
@RequestMapping(spring mvc实现的自定义注解)注解的值,这样才能跟请求的入参匹配.
那么我们来获取注解里面的值。
我的做法是这样的,
1 首先通过获取所要获取的注解作用的Java里面的结构(好吧我不太知道怎样去描述 就是说我们要获取的 注解只作用于方法 那就首先获取类的方法,要是作用于域那就获取类的域)。
2 在第一步的基础上获取注解
我们用代码来描述下吧
public static void main(String[] args) { // TODO Auto-generated method stub for(Field f:Targetdesc.class.getDeclaredFields()){//获取作用变量上的注解 //TargetField是作用在变量上的注解名 注解也是类 TargetField TargetField = f.getAnnotation(TargetField.class); if (TargetField != null) { System.out.println(TargetField.desc()); } } for(Method m:Targetdesc.class.getDeclaredMethods()){ TargetMethod fargetMethod =m.getAnnotation(TargetMethod.class); if (fargetMethod != null) { System.out.println(fargetMethod.desc()); } } }
打印出来的结果就是上述代码中注解的desc值
类变量静态变量也可以方法