JAVA 註解

註解的分類:(按照運行機制來分類)

1,源碼註解

2,編譯時註解(JDK自帶註解: Override, Deprecated, Suppvisewarnings)

3,運行時註解 (在運行階段起作用,可能會運行編譯的邏輯,例如 Autowired)


按照來源分類:

1,JDK自帶的註解

2,第三方的註解

3,自定義註解


自定義註解的語法:

成員類型是受限制的,只能是JAVA的8個基本類型,String,Class,Annotation,Enumberation。

可以沒有成員,沒有成員的註解稱爲標記註解。

public @interface Table {//用關鍵字@interface,成員以無參無異常的方式聲明

	/**
	 * 成員以無參無異常的方式聲明
	 * @return
	 */
	String dec();
	
	/**
	 * 只有一個成員時用規定用value(用其它的也不會報錯)
	 * @return
	 */
	String value();
	
	/**
	 * 可以用default設置一個默認值
	 * @return
	 */
	int age() default 18;
	
}




元註解:

1,註解的作用域

@Target ()

值:ElementType.Method 方法聲明

     ElementType.CONSTRUCTOR 構造方法聲明

     ElementType.FIELD 字段聲明

     ElementType.LOCAL_VARIABLE 局部變量聲明

     ElementType.PACKAGE 包聲明

ElementType.PARAMETER 參數聲明

  ElementType.TYPE 類,接口聲明


2,註解的生命週期

@Retention()

值:RetentionPolicy.SOURCE 只在源碼中顯示,編譯時會丟棄

RetentionPolicy.CLASS 編譯時會記錄到CLASS中,

RetentionPolicy.RUNTIME 運行時存在,可以通過反射來讀取


3,允許被子類繼承

@Inherited


4,生成JAVADOC時會包含註解

@Documented


註解的使用方法:

@<註解名>(<成員名1>=<成員值1>,<成員名2>=<成員值2>,......)

eg:


@Desc(desc="hello", name="tom", age=18)

解析註解:

概念:通過反射獲取類、函數或成員上的運行時(生命週期爲RUNTIME)註解信息,從而實現動態控制程序運行的邏輯


這是一個拼接sql的函數


public static String f(User user){
		StringBuffer sb = new StringBuffer();
		
		//獲取類
		Class c = user.getClass();
		
		//判斷類上是否有註解Table
		boolean tExist = c.isAnnotationPresent(Table.class);
		if(!tExist){
			return null;
		}
		
		Table t = (Table) c.getAnnotation(Table.class);
		
		//獲取註解成員值
		sb.append("select * from ").append(t.value()).append(" where 1 = 1 ");
		
		//獲取類的成員
		Field[] fArray = c.getDeclaredFields();
		
		//遍歷成員
		for (Field field : fArray) {
			
			boolean fExist = field.isAnnotationPresent(Column.class);
			
			if(!fExist){
				continue;
			}
			
			//獲取註解實例
			Column col = field.getAnnotation(Column.class);
			
			//獲取註解成員值
			String columnName = col.value();
			
			String fieldName = field.getName();
			
			//獲取類中成員的get方法名
			String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1, fieldName.length());
			
			Method m;
			Object columnValue;
			try {
				m = c.getMethod(methodName);
				//執行方法,獲取類中的成員值
				columnValue = m.invoke(user);
				
				if(columnValue == null){
					continue;
				}
				
				sb.append(" and ").append(columnName).append(" = ");
				if(columnValue instanceof String){
					sb.append("'");
				}
				sb.append(columnValue);
				if(columnValue instanceof String){
					sb.append("'");
				}
			} catch (NoSuchMethodException | SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		return sb.toString();
	}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章