Java反射的簡(jiǎn)單入門列肢,一分鐘簡(jiǎn)單小課堂

1.Class的簡(jiǎn)單介紹

Class類的類表示正在運(yùn)行的Java應(yīng)用程序中的類和接口。 枚舉是一種類官册,一個(gè)注解是一種接口生兆, 每個(gè)數(shù)組也屬于一個(gè)反映為類對(duì)象的類,該對(duì)象由具有相同元素類型和維數(shù)的所有數(shù)組共享攀隔。 原始Java類型(boolean皂贩,byte,char昆汹,short明刷,int,long满粗,float和double)辈末,和關(guān)鍵字void也表示為類對(duì)象。

  摘自jdk1.8中文版映皆,剛開始看可能不懂挤聘,現(xiàn)在逐句來(lái)解釋一下。

  第一句話:一個(gè)類被加載以后捅彻,JVM就會(huì)在內(nèi)存中給創(chuàng)建一個(gè)對(duì)應(yīng)類的Class對(duì)象组去。

  第二句話:類型相同的對(duì)象,維數(shù)相同的數(shù)組(不管長(zhǎng)度)共享的是同一個(gè)內(nèi)存中的Class對(duì)象步淹。

  第三句話:上面這些原始的類型从隆,也會(huì)在內(nèi)存中有一個(gè)與之對(duì)象的Class對(duì)象诚撵。

package com.dingyu;import org.junit.Test;/** * Class的簡(jiǎn)單使用方法 *? * @author 70241 * */public class ClassDemo {

? ? @Test? ? public void classTest1() {

? ? ? ? try {

Class class1 = Class.forName("com.dingyu.User");// 第一種獲取Class對(duì)象的方法? ? User user = new User();

?Class class2 = user.getClass();// 第二種獲取Class對(duì)象的方法

Class class3=User.class;//第三種獲取Class對(duì)象的方法

System.out.println("接下來(lái)判斷到底同一類的不同對(duì)象的Class對(duì)象是不是同一個(gè):"? ? ? ? ? ? ? ? ? ? + (class1.hashCode() == class2.hashCode()&&class1.hashCode() == class3.hashCode()));? ? ? ? }

catch (ClassNotFoundException e) {

e.printStackTrace();? ? ? ? }? ? }

@Test? ? public void classTest2() {

String[] s1 = new String[10];

String[] s2 = new String[30];

String[][] s3 = new String[3][30];? ? ? ? System.out.println(s1.getClass().hashCode()==s2.getClass().hashCode());? ? ? ? System.out.println(s1.getClass().hashCode()==s3.getClass().hashCode());

? ? ? ? ? ? }}

  2.Class獲取類的屬性,構(gòu)造器键闺,方法和注解的簡(jiǎn)單使用

package com.dingyu;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import org.junit.Test;/** * Class的簡(jiǎn)單用法 *? * @author dingyu * */public class ClassDemo02 {??

@Test? ? public void usingClass() throws Exception {? ? ? ?

Class userClass = Class.forName("com.dingyu.User");? ? ? ? // 獲得類名? ? ? ? System.out.println(userClass.getName());// 獲得全類名? ? ? ? System.out.println(userClass.getSimpleName());// 獲得類名

? ? ? // 獲得屬性

? ? ? ? Field[] fields = userClass.getDeclaredFields();// 獲得所有的屬性

? ? ? ? for (Field field : fields) {

? ? ? ? ? ? System.out.println(field.getName());? ? ? ? }? ? ? ? System.out.println(userClass.getDeclaredField("id").getName());// 獲得指定的屬性

? ? ? ? // 獲得方法

? ? ? Method[] methods = userClass.getDeclaredMethods();// 獲得所有的方法

? ? ? ? for (Method method : methods) {

? ? ? ? ? ? System.out.println(method.getName());

? ? ? ? }

? ? ? Method method = userClass.getDeclaredMethod("setId", int.class);// 獲得指定的方法寿烟,前面方法名,后面方法的參數(shù)

? ? ? System.out.println(method.getName());

? ? ? // 獲得構(gòu)造器

? ? ? Constructor[] constructors = userClass.getDeclaredConstructors();? ? ? ? System.out.println(constructors.length);

? ? ? Constructor constructor = userClass.getDeclaredConstructor(int.class, String.class, int.class);// 獲得指定的構(gòu)造器辛燥,需要指定構(gòu)造的參數(shù)? ? ? ? System.out.println(constructor.getName());

? ? ? ? // 獲得注解

? ? ? ? Annotation[] annotations = userClass.getAnnotations();

? ? ? ? for (Annotation annotation : annotations) {

? ? ? ? ? ? System.out.println(annotation);

? ? ? ? }

? ? ? // 指定注解名

? ? ? ? MyAnnotation annotation = (MyAnnotation)userClass.getDeclaredAnnotation(MyAnnotation.class);? ? ? ? System.out.println(annotation);

? }}

  3.Class動(dòng)態(tài)的調(diào)用構(gòu)造器筛武,方法,修改屬性

package com.dingyu;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import org.junit.Test;

/** * 使用反射動(dòng)態(tài)的調(diào)用構(gòu)造器挎塌,方法徘六,修改屬性? * @author 70241 * */

public class ClassDemo03 {

? @Test? ? @SuppressWarnings("all")

? ? public void usingClass() throws Exception {

? ? ? Class class1 = Class.forName("com.dingyu.User");

? ? ? ? ? ? ? //使用反射去調(diào)用構(gòu)造器

? ? ? ? User user1 = (User) class1.newInstance();//調(diào)用的是無(wú)參的

Constructor constructor = class1.getDeclaredConstructor(int.class,String.class,int.class);

//獲得有參的構(gòu)造器

? ? ? ? User user2 = (User) constructor.newInstance(04,"dingyu",20);

//動(dòng)態(tài)生成對(duì)象

? ? ? ? ? ? ? //使用反射去調(diào)用方法

? ? ? ? Method methodSetId = class1.getDeclaredMethod("setId",int.class);? ? ? ? methodSetId.invoke(user1, 02)

;//執(zhí)行user1中的setId,后面是給的參數(shù)

? ? ? ? System.out.println(user1.getId());

? ? ? ? ? ? ? ? //使用反射去修改屬性的值

? ? ? Field field = class1.getDeclaredField("age");

? ? ? ? field.setAccessible(true);//因?yàn)閍ge是私有的勃蜘,加上這句就表示這個(gè)屬性不需要做安全檢查

? ? ? field.set(user1, 20);

? ? ? System.out.println(field.get(user1));

? ? ? System.out.println(user1.getAge());

? ? ? ? ? ? ? ? ? ? ? ? ? }}

  4.反射獲得帶泛型的參數(shù)或返回值里泛型的的類型  

package com.dingyu;import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.Map;

/** * 反射獲得帶泛型的參數(shù)或返回值里泛型的的類型 *

@author dingyu * */public class ClassDemo04 {

? public void test01(Map map, String s) {

? ? }

? ? public Map test02()

{? ? ? ? return null;

? ? }

? ? public static void main(String[] args) throws Exception {

? ? ? ? //參數(shù)中帶泛型的

? ? ? ? Method method = ClassDemo04.class.getDeclaredMethod("test01", Map.class, String.class);

? ? ? ? Type[] types = method.getGenericParameterTypes();

// 返回一個(gè) Type對(duì)象的數(shù)組硕噩, Type以聲明順序表示由該對(duì)象表示的可執(zhí)行文件的形式參數(shù)類型

? ? ? ? // 打印這些參數(shù)的類型

? ? ? ? for (Type type : types) {

? ? ? ? ? ? System.out.println(type.getTypeName());

? ? ? ? ? ? if (type instanceof ParameterizedType) {

// 如果是泛型的參數(shù)

? ? ? ? ? ? ? ? Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();

// 獲得泛型的的類型

? ? ? ? ? ? ? ? for (Type type2 : actualTypeArguments) {

? ? ? ? ? ? ? ? ? ? System.out.println(type2.getTypeName());

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? }

? ? ? ? ? ? ? //返回值中帶泛型的

? ? ? ? Method method02 = ClassDemo04.class.getDeclaredMethod("test02");

? ? ? ? Type type = method02.getGenericReturnType();

// 返回的類型

? ? ? ? // 打印這些返回的類型

? ? ? ? ? ? ? ? ? ? System.out.println(type.getTypeName());

? ? ? ? if (type instanceof ParameterizedType) {// 如果是泛型的參數(shù)

? ? ? ? ? Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 獲得泛型的的類型

? ? ? ? ? ? for (Type type2 : actualTypeArguments) {? ? ? ? ? ? System.out.println(type2.getTypeName());

? ? ? ? ? ? }

? ? ? }

? ? ? ? ? ? ? }}

原作者:DingYu

原文:https://www.cnblogs.com/dddyyy/p/10009678.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末假残,一起剝皮案震驚了整個(gè)濱河市缭贡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辉懒,老刑警劉巖阳惹,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異眶俩,居然都是意外死亡莹汤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門颠印,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纲岭,“玉大人,你說(shuō)我怎么就攤上這事线罕≈钩保” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵钞楼,是天一觀的道長(zhǎng)喇闸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)询件,這世上最難降的妖魔是什么燃乍? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮宛琅,結(jié)果婚禮上刻蟹,老公的妹妹穿的比我還像新娘。我一直安慰自己嘿辟,他們只是感情好舆瘪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布痢艺。 她就那樣靜靜地躺著,像睡著了一般介陶。 火紅的嫁衣襯著肌膚如雪堤舒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天哺呜,我揣著相機(jī)與錄音舌缤,去河邊找鬼。 笑死某残,一個(gè)胖子當(dāng)著我的面吹牛国撵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玻墅,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼介牙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了澳厢?” 一聲冷哼從身側(cè)響起环础,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剩拢,沒(méi)想到半個(gè)月后线得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徐伐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年贯钩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片办素。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡角雷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出性穿,到底是詐尸還是另有隱情勺三,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布季二,位于F島的核電站檩咱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胯舷。R本人自食惡果不足惜刻蚯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桑嘶。 院中可真熱鬧炊汹,春花似錦、人聲如沸逃顶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霸褒,卻和暖如春伴找,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背废菱。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工技矮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殊轴。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓衰倦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親旁理。 傳聞我的和親對(duì)象是個(gè)殘疾皇子樊零,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 深入理解Class對(duì)象 RRTI的概念以及Class對(duì)象作用 認(rèn)識(shí)Class對(duì)象之前,先來(lái)了解一個(gè)概念孽文,RTTI(...
    架構(gòu)師springboot閱讀 1,565評(píng)論 0 3
  • 1.Class的簡(jiǎn)單介紹 Class類的類表示正在運(yùn)行的Java應(yīng)用程序中的類和接口驻襟。 枚舉是一種類,一個(gè)注解是一...
    零點(diǎn)145閱讀 172評(píng)論 0 0
  • 一叛溢、概述 Java反射機(jī)制定義 Java反射機(jī)制是在運(yùn)行狀態(tài)中塑悼,對(duì)于任意一個(gè)類劲适,都能夠知道這個(gè)類中的所有屬性和方法...
    CoderZS閱讀 1,637評(píng)論 0 26
  • 早上和兒子生完氣真的有點(diǎn)擔(dān)心楷掉,左盼右盼終于聽到他進(jìn)屋的聲音,然后習(xí)慣性的來(lái)房間找我霞势。 他說(shuō):“今天英語(yǔ)聽寫了烹植,不好...
    竹門藏日閱讀 92評(píng)論 0 0
  • 前情回顧:江南之遠(yuǎn)|處變不驚顯本色(三) 葉雅澄為布仁勒和克施針救治,覺(jué)察到一絲異常愕贡。眾人順藤摸瓜草雕,線索卻就此斷掉...
    古葉心閱讀 426評(píng)論 0 1