Java語言高級特性--注解與反射

注解

注解聲明

聲明一個(gè)注解類型

java中的所有的注解优炬,默認(rèn)實(shí)現(xiàn)Annotation接口:


聲明一個(gè)"class"不同的是授嘀,注解的聲明使用@interface關(guān)鍵字旷赖。一個(gè)注解的聲明如下:

public @interface Lance{

}? ? ?

元注解

在定義注解時(shí)给郊,注解類也能夠使用其他的注解聲明菩浙。對注解類型進(jìn)行注解類,我們稱之為 meta-annotation(元注解)睬愤,一般片仿,我們在定義自定義注解時(shí),需要指定的元注解有兩個(gè):

@Target

注解標(biāo)記標(biāo)記另一個(gè)注解尤辱,以限制可以應(yīng)用注解的java元素類型砂豌。目標(biāo)注解指定以下元素類型之一作為其值:

@Retention

注解指定標(biāo)記注解的存儲(chǔ)方式:

RetentionPolicy.SOURCE - 標(biāo)記的注解僅保留在源碼級別中厢岂,并被編譯器忽略。

RetentionPolicy.CLASS - 標(biāo)記的注解在編譯時(shí)由編譯器保留阳距,但Java虛擬機(jī)(JVM)會(huì)忽略

RetentionPolicy.RUNTIME - 標(biāo)記的注解由JVM保留塔粒,因此運(yùn)行時(shí)環(huán)境可以使用它。

@Retention三個(gè)值中SOURCE < CLASS < RUNTIME ,即CLASS包含了SOURCE,RUNTIME包含SOURCE筐摘、CLASS卒茬。下文會(huì)接介紹他們的不同應(yīng)用場景。


注解類型元素

在上文元注解中咖熟,允許在使用注解時(shí)傳遞參數(shù)圃酵。我們也能讓自定義注解的主體包含annotation type element(注解類型元素)聲明,它們看起來很像方法馍管,可以定義可選的默認(rèn)值郭赐。

注意:在使用注解時(shí),如果定義的注解中的類型元素?zé)o默認(rèn)值确沸,則必須進(jìn)行傳值
如果只存在value元素需要傳值的情況捌锭,則可以省略:元素名


了解反射

反射之中包含了一個(gè)【反】字,所以了解反射我們先從【正】開始罗捎,

一般情況下我們使用某個(gè)類時(shí)必定知道它是什么類观谦,是用來做什么的。于是我們直接對這個(gè)類進(jìn)行實(shí)例話桨菜,之后使用這個(gè)類對象進(jìn)行操作豁状。

Shap shap = new Shap();

shap.geCorlor();

反射是開始并不知道我們要初始化的對象是什么,自然也無法使用new關(guān)鍵字來創(chuàng)建對象了雷激。這時(shí)候,我們使用JDK提供的反射API進(jìn)行反射調(diào)用告私。

Class shapeClass = Class.forName("com.example.use.Shape");

Shape shapeInst = (Shape) shapeClass.newInstance();

Log.i("TAG","init: "+shapeInst.toString());

舉例:通過反射獲取類的幾種方式

Date date =new Date();

Class da = date.getClass();

Class da2 = Date.class;

Class da3 = Class.forName("java.util.Date");

Date da4 = (Date) da3.newInstance();

da4.setDate(1);

反射就是在運(yùn)行時(shí)才知道要操作的類是什么屎暇,并且可以在運(yùn)行時(shí)獲取類的完整構(gòu)造,并調(diào)用對應(yīng)的方法驻粟。

// 獲取類所有構(gòu)造方法

Constructor[] constructors = da.getConstructors();

for (Constructor c : constructors){

Log.i("constructors","獲取類所有構(gòu)造方法: "+c);

}

//? ? ? 獲取某指定構(gòu)造方法

Constructor constructor = da.getConstructor(int.class,int.class,int.class);

Log.i("constructors","獲取某指定構(gòu)造方法:--- "+constructor);

try {

Date date1 = constructor.newInstance(1,2,3);

Log.i("constructors","time:--- "+date1.getTime());

}catch (InvocationTargetException e) {

e.printStackTrace();

}

反射獲取構(gòu)造方法根悼,并設(shè)置值

Method[] methods = date.getDeclaredMethods();

for (int i =0; i < methods.length; i++) {

Log.i("intMethod","intMethod: "+methods[i].getName());

}

Method setYear = date.getDeclaredMethod("setYear",int.class);

Date date1 = (Date) date.newInstance();

setYear.invoke(date1,1000);

Log.i("intMethod","intMethod: "+setYear+"---"+date1.getYear());

反射修改成員變量的值

public class Person {

private int age;

private Stringname;

public Person() {

}

public Person(int age) {

this.age = age;

}

public Person(int age, String name) {

this.age = age;

this.name = name;

}

public Person(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}


Person person =new Person(333,"我");

Class cl = person.getClass();

Field fiAge = cl.getDeclaredField("age");

fiAge.setAccessible(true);

Object o = fiAge.get(person);

fiAge.set(person,222);//私有方法必須先設(shè)置為true

Log.i("person","setfield: "+person.getAge());

2022-10-09 00:48:40.872 3893-3893/com.example.myapplication I/person: setfield: 222

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜀撑,隨后出現(xiàn)的幾起案子挤巡,更是在濱河造成了極大的恐慌,老刑警劉巖酷麦,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矿卑,死亡現(xiàn)場離奇詭異,居然都是意外死亡沃饶,警方通過查閱死者的電腦和手機(jī)母廷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門轻黑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琴昆,你說我怎么就攤上這事氓鄙。” “怎么了业舍?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵抖拦,是天一觀的道長。 經(jīng)常有香客問我舷暮,道長态罪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任脚牍,我火速辦了婚禮向臀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诸狭。我一直安慰自己券膀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布驯遇。 她就那樣靜靜地躺著芹彬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叉庐。 梳的紋絲不亂的頭發(fā)上舒帮,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音陡叠,去河邊找鬼玩郊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枉阵,可吹牛的內(nèi)容都是我干的译红。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兴溜,長吁一口氣:“原來是場噩夢啊……” “哼侦厚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拙徽,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刨沦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膘怕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體想诅,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侧蘸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裁眯。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讳癌,靈堂內(nèi)的尸體忽然破棺而出穿稳,到底是詐尸還是另有隱情,我是刑警寧澤晌坤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布逢艘,位于F島的核電站,受9級特大地震影響骤菠,放射性物質(zhì)發(fā)生泄漏它改。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一商乎、第九天 我趴在偏房一處隱蔽的房頂上張望央拖。 院中可真熱鬧,春花似錦鹉戚、人聲如沸鲜戒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遏餐。三九已至,卻和暖如春赢底,著一層夾襖步出監(jiān)牢的瞬間失都,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工幸冻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粹庞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓洽损,卻偏偏與公主長得像庞溜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子趁啸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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