Java注解(未完)

注解(annotation)是JDK5之后引進(jìn)的新特性,是一種特殊的注釋,之所以說它特殊是因?yàn)椴煌谄胀ㄗ⑨專╟omment)能存在于源碼,而且還能存在編譯期跟運(yùn)行期,會(huì)最終編譯成一個(gè).class文件沽一,所以注解能有比普通注釋更多的功能。

JDK自帶的注解

@Deprecated 表明當(dāng)前的元素已經(jīng)不推薦使用
@Override 表明當(dāng)前方法是覆蓋了父類方法
@SuppressWarnings 關(guān)閉不當(dāng)?shù)木幾g器警告信息

元注解

  • @Documented 被修飾的注解會(huì)生成到j(luò)avadoc中漓糙。
  • @Retention設(shè)置注解的級(jí)別铣缠。默認(rèn)是RetentionPolicy.CLASS。
    注解@Retention(RetentionPolicy.CLASS) 的值有三種昆禽,即如下枚舉類
public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

SOURCE 代表源碼級(jí)別蝗蛙,注解只存在源碼中,其功能是與編譯器交互醉鳖,用于代碼檢測(cè)捡硅,如@Override, @SuppressWarings,這個(gè)級(jí)別的框架額外效率損耗發(fā)生在編譯時(shí)盗棵。

CLASS代表字節(jié)碼級(jí)別壮韭,注解存在源碼與字節(jié)碼文件中。

RUNTIME 代表運(yùn)行時(shí)級(jí)別纹因,注解存在源碼喷屋,字節(jié)碼與Java虛擬機(jī)中,主要用于運(yùn)行時(shí)反射獲取相關(guān)信息辐怕,許多框架就是使用這個(gè)級(jí)別的注解逼蒙,這個(gè)級(jí)別的框架額外的效率損耗發(fā)生在程序運(yùn)行時(shí)从绘。

  • @Target限制注解修飾的元素種類
public enum ElementType {
    TYPE,  /**接口寄疏、類、枚舉僵井、注解**/
    FIELD,  /**字段陕截、枚舉的常量**/
    METHOD, /**方法**/
    PARAMETER,  /**方法參數(shù)**/
    CONSTRUCTOR, /**構(gòu)造方法**/
    LOCAL_VARIABLE,  /**局部變量**/
    ANNOTATION_TYPE, /**注解**/
    PACKAGE,  /**包**/
    TYPE_PARAMETER,  /**表示該注解能寫在類型變量的聲明語句中。 java8新增**/
    TYPE_USE  /**表示該注解能寫在使用類型的任何語句中批什。 java8新增**/
}

注意:不加元注解@Target的情況下农曲,注解可以修飾各種元素,比如可以修飾類,可以修飾變量乳规,可以修飾方法等形葬。

  • @Inherited讓注解可以被繼承
    @Inherited可以讓注解類似被繼承一樣,但是這并不是真的繼承暮的。通過使用@Inherited笙以,只可以讓子類類對(duì)象使用getAnnotations()反射獲取父類被@Inherited修飾的注解。
package com.zheting.it.test01;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;

public class Test {

    @UnInheritable
    @Inheritable
    public static class Super{

    }

    public static class Sub extends  Super {

    }

    public static void main(String[] args) {
        Super instance=new Sub();
        System.out.println(Arrays.toString(instance.getClass().getAnnotations()));  //[@com.zheting.it.test01.Inheritable()]
    }
}

//自定義的注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Inheritable{

}

//自定義的注解
@interface UnInheritable{
    
}

用運(yùn)行時(shí)注解生成sql語句的Demo

package com.zheting.it.test02;

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

@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String name();
}

package com.zheting.it.test02;

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

@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name();
}

package com.zheting.it.test02;

public class NameAndType {
    private String type;
    private String name;

    public NameAndType(String type, String name) {
        this.name = name;
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.zheting.it.test02;

@Table(name = "user_t")
public class User {

    @Column(name = "user_name")
    String userName;
    @Column(name = "gender")
    boolean gender;

}
package com.zheting.it.test02;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Utils {

    //獲取表名
    private static String getTableName(Class<?> bean) {
        String name = null;
        //判斷是否有Table注解
        if (bean.isAnnotationPresent(Table.class)) {
            //獲取注解對(duì)象
            Table table = bean.getAnnotation(Table.class);
            name =table.name();
        }
        return name;
    }

    //獲取字段名與類型
    private static List<NameAndType> getColumns(Class<?> bean) {
        List<NameAndType> columns = new ArrayList<NameAndType>();
        Field[] fields = bean.getDeclaredFields();
        if (fields != null) {
            //分析Bean中的變量是否需要生成sql字段
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                if (field.isAnnotationPresent(Column.class)) {
                    //生成sql字段的名
                    Column column = field.getAnnotation(Column.class);
                    String name=column.name();
                    //生成sql字段的類型
                    String type = null;
                    if (int.class.isAssignableFrom(field.getType())) {
                        type = "integer";
                    } else if (boolean.class.isAssignableFrom(field.getType())) {
                        type = " tinyint(1)";
                    } else if (String.class.isAssignableFrom(field.getType())) {
                        type = "text";
                    } else {
                        throw new RuntimeException("unspported type=" + field.getType().getSimpleName());
                    }
                    columns.add(new NameAndType(type, name));
                }
            }
        }
        return columns;
    }

    //生成建表sql語句
    public static String createTable(Class<?> bean) {
        String tableName = getTableName(bean);
        List<NameAndType> columns = getColumns(bean);
        if (tableName != null && !tableName.equals("") && !columns.isEmpty()) {
            StringBuilder createTableSql = new StringBuilder("create table ");
            //加表名
            createTableSql.append(tableName);
            createTableSql.append("(");

            //加表中字段
            for (int i = 0; i < columns.size(); i++) {
                NameAndType column = columns.get(i);
                createTableSql.append(column.getName());
                createTableSql.append(" ");
                createTableSql.append(column.getType());
                // 追加下一個(gè)字段定義前需要添加逗號(hào)
                if (i != columns.size() - 1) {
                    createTableSql.append(",");
                }
            }
            createTableSql.append(")");
            return createTableSql.toString();
        }

        return null;
    }
}
package com.zheting.it.test02;

public class Test {

    public static void main(String... args){
        //create table user_t(user_name text,gender  tinyint(1))
        System.out.println(Utils.createTable(User.class));
    }
}

源碼級(jí)注解自定義Demo冻辩,沒有搞出來猖腕。有時(shí)間再搞

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨闪,隨后出現(xiàn)的幾起案子倘感,更是在濱河造成了極大的恐慌,老刑警劉巖咙咽,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件老玛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡犁珠,警方通過查閱死者的電腦和手機(jī)逻炊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犁享,“玉大人余素,你說我怎么就攤上這事〈独ィ” “怎么了桨吊?”我有些...
    開封第一講書人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凤巨。 經(jīng)常有香客問我视乐,道長(zhǎng),這世上最難降的妖魔是什么敢茁? 我笑而不...
    開封第一講書人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任佑淀,我火速辦了婚禮,結(jié)果婚禮上彰檬,老公的妹妹穿的比我還像新娘伸刃。我一直安慰自己,他們只是感情好逢倍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開白布捧颅。 她就那樣靜靜地躺著,像睡著了一般较雕。 火紅的嫁衣襯著肌膚如雪碉哑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音扣典,去河邊找鬼妆毕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贮尖,可吹牛的內(nèi)容都是我干的设塔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼远舅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼闰蛔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起图柏,我...
    開封第一講書人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤序六,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚤吹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體例诀,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年裁着,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了繁涂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡二驰,死狀恐怖扔罪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桶雀,我是刑警寧澤矿酵,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站矗积,受9級(jí)特大地震影響全肮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棘捣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一辜腺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乍恐,春花似錦评疗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑彪。三九已至瞧毙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宙彪。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工矩动, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人释漆。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓悲没,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親男图。 傳聞我的和親對(duì)象是個(gè)殘疾皇子示姿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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