第21天dao模型二(更為精簡)之泛型的反射

來源:互聯網
上載者:User



1、使用帶有泛型資訊的類:
  a、兩邊都帶有泛型的,一定要一致
   ArrayList<String> list = new ArrayList<String>();
  b、單邊有泛型資訊也是可以的
   ArrayList<String> list = new ArrayList ();  新程式員調用老程式員的內容
   ArrayList list = new ArrayList<String>();   老程式員調用新程式員的內容
 2、自訂泛型:
  a、可以在定義類的後面就聲明泛型,類中的執行個體方法就可以直接使用。
   public class Demo1<T> {//類層級的泛型定義。類中的“執行個體方法”就可以直接使用
 
    //<T>:泛型定義的聲明。在返回值的前面
    public  T findOne(Class<T> clazz){
     return null;
    }
  b、靜態方法必須單獨定義後才能使用。在返回值得前面定義
    public static <T> void u1(T t){
    
    }
  c、可以同時生命多個泛型的定義
   public static <K,V> V findValue(K k){//MAP
    return null;
   }
  
 3、使用帶有泛型資訊的類注意事項:
  只有物件類型才能作為泛型方法的實際參數


dao介面不變。

主要是實現變了,不需要寫那麼多代碼,在basedao中做了處理即對泛型進行了反射

import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import org.hibernate.Session;import com.itheima.dao.CustomerDao;import com.itheima.dao.Dao;import com.itheima.domain.Customer;//藉助Hibernatepublic class BaseDao<T> implements Dao<T> {private Session session = null;//當做有了這個對象private Class clazz;//從哪個表中操作public BaseDao(){//泛型的反射:目的,給成員變數clazz賦值,好讓查詢、刪除知道從哪個表中操作System.out.println(this.getClass().getName());//this:就是哪個實實在在的對象  CustomerDao cDao = new CustomerDaoImpl();  CustoemrDaoImpl的執行個體Type type = this.getClass().getGenericSuperclass();//擷取帶有泛型資訊的父類   "BaseDao<Customer>"     Type是Class類的介面ParameterizedType pType = (ParameterizedType)type; clazz = (Class) pType.getActualTypeArguments()[0];}public void add(T t) {session.save(t);}public void update(T t) {session.update(t);}public void delete(Serializable id) {T t  =findOne(id);session.delete(t);}public T findOne(Serializable id) {System.out.println(clazz.getName());return (T) session.get(clazz, id);}}
package com.jxnu.dao.impl;import java.util.List;import com.itheima.dao.CustomerDao;import com.itheima.domain.Customer;public class CustomerDaoImpl extends BaseDao<Customer> implements CustomerDao {//public CustomerDaoImpl(){//super();//}public List<Customer> findRecords(int startIndex, int pageSize) {// TODO Auto-generated method stubreturn null;}}


package com.jxnu.dao.impl;import java.util.List;import com.itheima.dao.UserDao;import com.itheima.domain.User;public class UserDaoImpl extends BaseDao<User> implements UserDao {@Overridepublic List<User> findAll() {// TODO Auto-generated method stubreturn null;}}

實現層減少了代碼。


關鍵代碼是:

private Class clazz;//從哪個表中操作
 public BaseDao(){
  //泛型的反射:目的,給成員變數clazz賦值,好讓查詢、刪除知道從哪個表中操作
  System.out.println(this.getClass().getName());
  //this:就是哪個實實在在的對象  CustomerDao cDao = new CustomerDaoImpl();  CustoemrDaoImpl的執行個體
  Type type = this.getClass().getGenericSuperclass();//擷取帶有泛型資訊的父類   "BaseDao<Customer>"     Type是Class類的介面
  ParameterizedType pType = (ParameterizedType)type;
  clazz = (Class) pType.getActualTypeArguments()[0];
 }
 




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.