java注解基本知识

@RequestMapping("/addActivity.ajax")
@ResponseBody
publi void addActivity(Activity activity){

}

这是spring mvc Controller 中的注解 意思是下面的方法(addActivity)处理addActivity.ajax的请求,不止是spring mvc,在整个spring 体系中,包括其余框架中都有大量用到注解,那咱们如今来了解下注解的知识.java

注解的创建ajax

    

 快捷键 Ctrl+N 选择Annoationspring

元注解mvc

             1.@Target
    2.@Retention,
    3.@Documented,
    4.@Inheritedapp

                这是Java的四个元注解,能够用来修饰咱们本身定义的注解,也能够理解成注解的注解,框架

       @Target,@Retention比较常见函数

@Retentionspa

   这个注解代表会被保留到哪一个阶段. 有三个值:
   RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
   RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
   RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,因此他们能在运行时被JVM或其余      使用反射机制的代码所读取和使用..net

   通常咱们用到自定义注解的时候都会用到反射,因此建立字自定义注解时通常设置成RUNTIME级别code

  若是没设置@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值

类变量
静态变量也能够
方法
相关文章
相关标签/搜索