泛型和反射在項目中的基本應(yīng)用之一

一般在抽取的公共類中會涉及到泛型拼坎,而泛型的類型需要用到反射類中的方法確定泛型類型握联。


/**
 * Created by 26685 on 2017/7/4.
 */

/**
 * Transactional
 * spring中注解是可以繼承的,但是不可以向上延伸。
 *
 * 既在本抽象類中不加入@Transactional注解,只在子類中加入注解依痊,
 * 本類中的方法用到事物會報錯
 * javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread
 *
 * 若只在本類中加入事務(wù)控制,不在子類中加注解怎披,
 * 子類也會有事務(wù)控制
 *
 */
@Transactional
public abstract class DaoImpl<T> implements Dao<T> {
    @PersistenceContext
    protected EntityManager em;

    protected Class<T> entityClass =  getEntityClass();

    public void add(T entity) {
        em.persist(entity);
    }

    public void delete(Serializable id) {
        em.remove(em.getReference(entityClass,id));
    }

    public T update(T entity) {
        return em.merge(entity);
    }

    @Transactional(propagation= Propagation.NOT_SUPPORTED)
    public T findOne(Serializable id) {
        return em.find(entityClass,id);
    }

    @Transactional(propagation= Propagation.NOT_SUPPORTED)
    public long getCount() {
        return (Long)em.createQuery("select count(1) from "+ getEntityName() +" o").getSingleResult();
    }

    /**
     * 獲取泛型類型
     * 思路:
     *      BuyerServiceImpl extends DaoImpl<Buyer>
     *      通過子類獲取泛型
     * 1. 獲取子類Class胸嘁,既BuyerServiceImpl
     *    getClass() 獲取運行時類
     *
     * 2. 獲取抽象類,抽象類包括泛型 凉逛,既DaoImpl<Buyer>
     *    Type getGenericSuperclass() 獲取帶有泛型的父類
     *    Type是 Java 編程語言中所有類型的公共高級接口性宏。它們包括原始類型、參數(shù)化類型鱼炒、數(shù)組類型衔沼、類型變量和基本類型蝌借。
     *    泛型類內(nèi)部已自動實現(xiàn)Type接口
     *    ParameterizedType 是參數(shù)化類型昔瞧,既泛型,繼承Type類
     *
     * 3. 獲取泛型類
     *    Type[] getActualTypeArguments() 獲取真實參數(shù)類型
     */
    public Class<T> getEntityClass(){
        Type type = this.getClass().getGenericSuperclass();
        if(type instanceof ParameterizedType){
            ParameterizedType pt = (ParameterizedType)type;
            return (Class<T>) pt.getActualTypeArguments()[0];
        }
        return null;
    }

    /**
     * 獲取泛型數(shù)據(jù)庫表名
     * 思路:
     *      獲取泛型類
     *      @Entity
     *      public class Buyer {}
     *      通過泛型類獲得注解Entity,獲取Entity的屬性name
     *
     * 1. 獲取泛型類
     *    Class<T> getEntityClass()
     *
     * 2. 獲得注解Entity
     *    <A extends Annotation> A getAnnotation(Class<A> annotationClass)
     *
     * 3. 判斷Entity的name屬性是否為空菩佑,非空的話自晰,name值就是表名稱
     *    Type[] getActualTypeArguments() 獲取真實參數(shù)類型
     *
     * @return
     */
    public String getEntityName(){
        String entityName = getEntityClass().getSimpleName();
        Entity clazz = getEntityClass().getAnnotation(Entity.class);
        if(null!=clazz.name()&&clazz.name().trim().length()>0){
            entityName=clazz.name();
        }
        return entityName;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稍坯,隨后出現(xiàn)的幾起案子酬荞,更是在濱河造成了極大的恐慌,老刑警劉巖瞧哟,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件混巧,死亡現(xiàn)場離奇詭異,居然都是意外死亡勤揩,警方通過查閱死者的電腦和手機咧党,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陨亡,“玉大人傍衡,你說我怎么就攤上這事深员。” “怎么了蛙埂?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵倦畅,是天一觀的道長。 經(jīng)常有香客問我绣的,道長叠赐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任屡江,我火速辦了婚禮燎悍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好闪彼,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布民褂。 她就那樣靜靜地躺著,像睡著了一般费彼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天鸽粉,我揣著相機與錄音,去河邊找鬼抓艳。 笑死触机,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的玷或。 我是一名探鬼主播儡首,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偏友!你這毒婦竟也來了蔬胯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤位他,失蹤者是張志新(化名)和其女友劉穎氛濒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹅髓,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡舞竿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窿冯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骗奖。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出重归,到底是詐尸還是另有隱情米愿,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布鼻吮,位于F島的核電站育苟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏椎木。R本人自食惡果不足惜违柏,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望香椎。 院中可真熱鬧漱竖,春花似錦、人聲如沸畜伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玛界。三九已至万矾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慎框,已是汗流浹背良狈。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笨枯,地道東北人薪丁。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像馅精,于是被迫代替她去往敵國和親严嗜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 整體Retrofit內(nèi)容如下: 1硫嘶、Retrofit解析1之前哨站——理解RESTful 2阻问、Retrofit解析...
    隔壁老李頭閱讀 4,594評論 2 12
  • 1. 泛型概述 泛型(Generic type 或者 generics)是對 Java 語言的類型系統(tǒng)的一種擴展梧税,...
    JackChen1024閱讀 515評論 0 3
  • G大一年一度的籃球賽即將召開了沦疾。如果你的宿舍樓剛好對著籃球場而你又恰好在休息時間站在窗前的話,你就能把籃球場上那些...
    王偉應(yīng)閱讀 262評論 0 0
  • 李梓陽發(fā)燒寶爸擔心看寶太累了第队,在家休息哮塞,沒有去加班。李梓陽6:30起床了凳谦,5點左右發(fā)燒到了39.1℃忆畅,擔心吃...
    李梓旭媽媽閱讀 155評論 0 1
  • 現(xiàn)在凌晨零點三十八分家凯,我剛掛了電話缓醋,與我的好姐妹。 她撥通電話就興奮的問:“你猜我在哪里绊诲?” 我睡得迷迷糊糊的說:...
    馮阿韻閱讀 263評論 1 11