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值

類變量
靜態變量也能夠
方法
相關文章
相關標籤/搜索