Java開發中的註解技術



概述



   

註解與註釋,

        註解,告訴編譯器如何運行程序!

        註釋,給程序員閱讀,對編譯、運行沒有影響;

 

註解作用,

        1.告訴編譯器如何運行程序;

        2.簡化(取代)配置文件  

常用的註解如下:




        

//重寫父類的方法

   @Override

   public String toString() {

      returnsuper.toString();

   }

   

   //抑制編譯器警告

   @SuppressWarnings({"unused","unchecked"})

   privatevoid save() {

       List list =null;

   }

   

   //標記方法以及過時

   @Deprecated

   privatevoidsave1() {

   }



元註解:表示註解的註解

   

指定註解的可用範圍:


    

@Target({


TYPE,    


FIELD,    字段


METHOD, 方法


PARAMETER,  參數


CONSTRUCTOR,構造器


 LOCAL_VARIABLE 局部變量


})



元註解 - 2.指定註解的聲明週期


@Retention(RetentionPolicy.SOURCE)   註解只在源碼級別有效


@Retention(RetentionPolicy.CLASS)     註解在字節碼即別有效 默認值


@Retention(RetentionPolicy.RUNTIME)  註解在運行時期有效


    註解案例之優化BaseDao的代碼

一、創建Bean實體類

           

package cn.sp.utils;
@Table(tableName="admin")
public class Admin2 {
		@ID
		@Column(columnName="id")
		private int id2;
		
		@Column(columnName="userName")
		private String userName2;
		
		@Column(columnName="pwd")
		private String pwd2;
		public int getId2() {
			return id2;
		}
		public void setId2(int id2) {
			this.id2 = id2;
		}
		public String getUserName2() {
			return userName2;
		}
		public void setUserName2(String userName2) {
			this.userName2 = userName2;
		}
		public String getPwd2() {
			return pwd2;
		}
		public void setPwd2(String pwd2) {
			this.pwd2 = pwd2;
		}
		@Override
		public String toString() {
			return "Admin2 [id2=" + id2 + ", userName2=" + userName2 + ", pwd2=" + pwd2 + "]";
		}
		
		
}

二、創建註解類


                    




package cn.sp.utils;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.ResultSetHandler;

import cn.sp.dao.JdbcUtil;

public class BaseDao_2 <T>{
		private 	Class<T> clazz;
		private String tableName;	
		private String id_primary;
	
		public BaseDao_2() {
			Type type=this.getClass().getGenericSuperclass();
			ParameterizedType pt=(ParameterizedType) type;
			Type[] types = pt.getActualTypeArguments();
			clazz=(Class<T>) types[0];
			/*******獲取表名******/
			Table table = clazz.getAnnotation(Table.class);
			tableName = table.tableName();
			//已經拿到Admin2.class
			//獲取當前運行類的所有字段,遍歷。獲取每一個字段上的id註解
			Field[] fs = clazz.getDeclaredFields();
			for (Field field : fs) {
				//設置強制訪問
				field.setAccessible(true);
				//獲取每一個字段上的ID註解
				ID anno_id = field.getAnnotation(ID.class);
				//判斷
				if(anno_id!=null){
					//如果當前字段有ID註解,說明是主鍵,再獲取字段名稱
					Column column = field.getAnnotation(Column.class);
					//主鍵
					id_primary=column.columnName();
					break;
				}
			}
			System.out.println("表:"+tableName);
			System.out.println("主鍵:"+id_primary);
		}
		public T findById(int id){
			try {
				String sql="select * from "+tableName+" where id=?";
				return	JdbcUtil.getQueryRunner().query(sql, new MyBeanHandler<T>(clazz),id);
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		public List<T> getAll(){
			try {
				String sql="select * from "+tableName;
				return	JdbcUtil.getQueryRunner().query(sql, new MyBeanListHandler<T>(clazz));
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
}

/**
 * 自定義結果集封裝單個Bean對象
 */
class MyBeanHandler<T> implements ResultSetHandler<T>{
	private Class<T> clazz;
	
	public MyBeanHandler(Class<T> clazz) {
		this.clazz=clazz;
	}

	@Override
	public T handle(ResultSet rs) throws SQLException {
	try {
		T t=clazz.newInstance();
		if(rs.next()){
			Field[] fs = clazz.getDeclaredFields();
			for (Field f : fs) {
				String fieldName=f.getName();
				Column column = f.getAnnotation(Column.class);
				String columnName=column.columnName();
				Object columnValue=rs.getObject(columnName);
				//設置 BeanUtils組件
				BeanUtils.copyProperty(t, fieldName, columnValue);
			}
		}
		return t;
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
	}

	
	

}
	

/**自定義結果集封裝多個Bean對象
 */

class MyBeanListHandler<T>  implements ResultSetHandler<List<T>>{
private Class<T> clazz;
	
	public MyBeanListHandler(Class<T> clazz) {
		this.clazz=clazz;
	}
	public List<T> handle(ResultSet rs) throws SQLException {
					ArrayList<T> list = new ArrayList<T>();
					
					try {
						while(rs.next()){
							T t=clazz.newInstance();
						
							Field[] fs = clazz.getDeclaredFields();
							for (Field f : fs) {
								String fieldName=f.getName();
								Column column = f.getAnnotation(Column.class);
								String columnName=column.columnName();
								Object columnValue=rs.getObject(columnName);
								//設置 BeanUtils組件
								BeanUtils.copyProperty(t, fieldName, columnValue);
							}
							list.add(t);
						}
						return list;
					} catch (Exception e) {
						throw new RuntimeException(e);
					}
		}
	
}

創建類AdminDao2(用於測試執行)

package cn.sp.utils;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;

public class AdminDao2 extends BaseDao_2<Admin2> {
	@Test
	public void testName() throws Exception {
		AdminDao2 dao2 = new AdminDao2();
		Admin2 ad2 = dao2.findById(1);
		List<Admin2> list = dao2.getAll();
		System.out.println(ad2);
		System.out.println(list);
	}
}


相關注解代碼:

package cn.sp.utils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * 用於描述主鍵
 * @author Administrator
 *
 */
@Retention(RetentionPolicy.RUNTIME)  // 指定註解在運行時期有效
public @interface ID {

}
package cn.sp.utils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)  // 指定註解在運行時期有效
public @interface Table {
			String tableName();
}

package cn.sp.utils;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)  // 指定註解在運行時期有效
public @interface Column {
	String columnName();
}

注意:一定要在註解上加元註解@Retention(RetentionPolicy.RUNTIME),否則運行時註解失效,會報空指針異常!






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