反射

反射獲取構(gòu)造方法對象并且創(chuàng)建對象

通過反射獲取構(gòu)造方法并且創(chuàng)建對象

*? ? ? ? ? ? ? ? ?1.通過反射獲取字節(jié)碼文件對象

*? ? ? ? ? ? ? ? ?2.通過字節(jié)碼文件對象獲取構(gòu)造方法對象 ?Constructor

*? ? ? ? ? ? ? ? ? ? ? ? ?Constructor<?>[] getConstructors() // 獲取公有修飾的構(gòu)造方法對象

*? ? ? ? ? ? ? ? ? ? ? ? ?Constructor<?>[] getDeclaredConstructors() // 獲取所有的構(gòu)造方法對象

*? ? ? ? ? ? ? ? ? ? ? ? ?Constructor<T> getConstructor(Class<?>... parameterTypes)

*? ? ? ? ? ? ? ? ? ? ? ? ?Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

*/

public class ReflectDemo01 {

? ? ? ?public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {

? ? ? ? ? ? ? ?Class<?> c = Class.forName("com.sxt.reflectdemo2.Student");

? ? ? ? ? ? ? ?Constructor<?>[] constructors = c.getConstructors();

? ? ? ? ? ? ? ?for (Constructor<?> constructor : constructors) {

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

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?System.out.println("----------------------------------");

? ? ? ? ? ? ? ?Constructor<?>[] declaredConstructors = c.getDeclaredConstructors();

? ? ? ? ? ? ? ?for (Constructor<?> constructor : declaredConstructors) {

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

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?System.out.println("----------------------------------");

? ? ? ? ? ? ? ?// 獲取所有的構(gòu)造方法在開發(fā)中有意義? 沒有什么實(shí)際意義易稠,所以我們來獲取單個構(gòu)造方法

? ? ? ? ? ? ? ?// 獲取無參構(gòu)造方法

// ? ? ? ? ? ? ? ?c.getConstructor(Class<?>... parameterTypes ?Class ?class)

? ? ? ? ? ? ? ?Constructor<?> constructor = c.getConstructor();

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

? ? ? ? ? ? ? ?Constructor<?> constructor2 = c.getConstructor(String.class,int.class);

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

? ? ? ? ? ? ? ?// 獲取私有構(gòu)造方法

? ? ? ? ? ? ? ?// java.lang.NoSuchMethodException

// ? ? ? ? ? ? ? ?Constructor<?> constructor3 = c.getConstructor(String.class);

// ? ? ? ? ? ? ? ?System.out.println(constructor3);

? ? ? ? ? ? ? ?Constructor<?> constructor3 = c.getDeclaredConstructor(String.class);

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

? ? ? ?}

}

/*

* 通過反射獲取構(gòu)造方法對象并且創(chuàng)建對象

*

* 反射之前的做法:

*? ? ? ? ?Student s = new Student();

*

* 反射之后:

*? ? ? ? ? ? ? ? ?1.獲取字節(jié)碼文件對象

*? ? ? ? ? ? ? ? ?2.通過字節(jié)碼文件對象獲取構(gòu)造方法對象

*? ? ? ? ? ? ? ? ?3.通過構(gòu)造方法對象創(chuàng)建對象

*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? T newInstance(Object... initargs)

*/

public class ReflectDemo02 {

? ? ? ?public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,

? ? ? ? ? ? ? ? ? ? ? ?InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,

? ? ? ? ? ? ? ? ? ? ? ?FileNotFoundException, IOException {

? ? ? ? ? ? ? ?Properties prop = new Properties();

? ? ? ? ? ? ? ?prop.load(new FileReader("prop.txt"));

? ? ? ? ? ? ? ?String value = prop.getProperty("ClassName");

? ? ? ? ? ? ? ?Class<?> c = Class.forName(value);

? ? ? ? ? ? ? ?Constructor<?> con = c.getConstructor();

? ? ? ? ? ? ? ?Object obj = con.newInstance();

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

? ? ? ? ? ? ? ?Student student = (Student) obj;

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

? ? ? ? ? ? ? ?// 我想要調(diào)用帶全參數(shù)的怎么辦

? ? ? ? ? ? ? ?Constructor<?> constructor = c.getConstructor(String.class, int.class);

? ? ? ? ? ? ? ?Object obj2 = constructor.newInstance("隔壁老王", 50);

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

? ? ? ? ? ? ? ?// 我想獲取私有構(gòu)造方法并且造對象

? ? ? ? ? ? ? ?// java.lang.NoSuchMethodException:

? ? ? ? ? ? ? ?// Constructor<?> constructor2 = c.getConstructor(String.class);

? ? ? ? ? ? ? ?Constructor<?> constructor2 = c.getDeclaredConstructor(String.class);

? ? ? ? ? ? ? ?// java.lang.IllegalAccessException

? ? ? ? ? ? ? ?// 暴力訪問

? ? ? ? ? ? ? ?constructor2.setAccessible(true);

? ? ? ? ? ? ? ?Object obj3 = constructor2.newInstance("隔壁老李");

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

? ? ? ?}

}

反射獲取成員變量對象并且賦值


通過反射獲取成員變量對象

*? ? ? ? ? ? ? ? ?Field

*

* Field[] getFields() ?獲取公有修飾的成員變量對象

* Field[] getDeclaredFields() ?獲取所有成員變量對象

* Field getField(String name) 獲取指定的公共成員變量對象

* Field getDeclaredField(String name) 獲取指定任意成員變量對象

*

* Object get(Object obj) 返回指定對象上此 Field 表示的字段的值。

*/

public class ReflectDemo01 {

? ? ? ?public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {

? ? ? ? ? ? ? ?Class<?> c = Class.forName("com.sxt.reflectdemo3.Student");


? ? ? ? ? ? ? ?Field[] fields = c.getFields();

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

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

? ? ? ? ? ? ? ?}


? ? ? ? ? ? ? ?System.out.println("---------------");

? ? ? ? ? ? ? ?Field[] declaredFields = c.getDeclaredFields();

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

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

? ? ? ? ? ? ? ?}


? ? ? ? ? ? ? ?System.out.println("---------------");

? ? ? ? ? ? ? ?// declaredFields

? ? ? ? ? ? ? ?Field field = c.getField("address");

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

? ? ? ? ? ? ? ?System.out.println("---------------");

? ? ? ? ? ? ? ?Field field2 = c.getDeclaredField("name");

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


? ? ? ?}

}

public class ReflectDemo02 {

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

? ? ? ? ? ? ? ?Class<?> c = Class.forName("com.sxt.reflectdemo3.Student");

? ? ? ? ? ? ? ?// 給sex屬性賦值,值為女

? ? ? ? ? ? ? ?Field sexFiled = c.getDeclaredField("sex");

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

? ? ? ? ? ? ? ?// 反射之前 Student s = new Student(); s.sex = "女";

? ? ? ? ? ? ? ?// 反射之后

? ? ? ? ? ? ? ?Constructor<?> con = c.getDeclaredConstructor();

? ? ? ? ? ? ? ?Object obj = con.newInstance();

? ? ? ? ? ? ? ?// ?Object get(Object obj) 返回指定對象上此 Field 表示的字段的值份乒。

? ? ? ? ? ? ? ?sexFiled.set(obj, "女");

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


? ? ? ? ? ? ? ?Field nameField = c.getDeclaredField("name");

? ? ? ? ? ? ? ?nameField.setAccessible(true);

? ? ? ? ? ? ? ?nameField.set(obj, "隔壁老張");

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

? ? ? ? ? ? ? ?System.out.println(nameField.get(obj));

? ? ? ?}

}

反射獲取成員方法對象并且調(diào)用

通過反射獲取成員方法對象并且調(diào)用

* c.getMethods() 獲取所有公有方法 包括父類繼承過來的成員

* c.getDeclaredMethods() 獲取本類中所有方法零酪,包括私有

*

* ?Method getMethod(String name, Class<?>... parameterTypes)

* ?Method getDeclaredMethod(String name, Class<?>... parameterTypes)

* ? ? ? ? ? ? ? ? ?第一個參數(shù)是方法名稱, 第二個參數(shù)是參數(shù)類型列表

* ?

* ?Object invoke(Object obj, Object... args)

* ?

* ?使用反射書寫一個能夠給任意對象設(shè)置任意的值的方法

*/

public class ReflectDemo01 {

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

? ? ? ? ? ? ? ?Class<?> c = Class.forName("com.sxt.reflectdemo4.Student");


? ? ? ? ? ? ? ?Constructor<?> con = c.getDeclaredConstructor();


? ? ? ? ? ? ? ?Object obj = con.newInstance();


? ? ? ? ? ? ? ?Method[] methods = c.getMethods();


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

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

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?System.out.println("--------------------------");

? ? ? ? ? ? ? ?Method[] declaredMethods = c.getDeclaredMethods();

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

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

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?System.out.println("--------------------------");


? ? ? ? ? ? ? ?// 獲取無參方法show并且調(diào)用

? ? ? ? ? ? ? ?Method method = c.getDeclaredMethod("show");

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

? ? ? ? ? ? ? ?method.invoke(obj);

? ? ? ? ? ? ? ?System.out.println("--------------------------");


? ? ? ? ? ? ? ?// public void method(String s)

? ? ? ? ? ? ? ?Method method2 = c.getDeclaredMethod("method", String.class);

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

? ? ? ? ? ? ? ?method2.invoke(obj, "Hello");

? ? ? ? ? ? ? ?System.out.println("--------------------------");

? ? ? ? ? ? ? ?// public String concat(int a, String s, double d)

? ? ? ? ? ? ? ?Method method3 = c.getDeclaredMethod("concat", int.class, String.class, double.class);

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

? ? ? ? ? ? ? ?Object result = method3.invoke(obj, 20, "張三", 2.5);

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

? ? ? ? ? ? ? ?System.out.println("--------------------------");

? ? ? ? ? ? ? ?//private void show2()

? ? ? ? ? ? ? ?Method method4 = c.getDeclaredMethod("show2");

? ? ? ? ? ? ? ?method4.setAccessible(true);

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

? ? ? ? ? ? ? ?method4.invoke(obj);


? ? ? ? ? ? ? ?// int getModifiers()

? ? ? ? ? ? ? ?int modifiers = method4.getModifiers();

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


? ? ? ?}

}

public class Student {

? ? ? ?private String name;

? ? ? ?int age;

? ? ? ?public String address;

? ? ? ?protected String sex;


? ? ? ?public Student() {

? ? ? ? ? ? ? ?super();

? ? ? ?}

? ? ? ?public Student(String name, int age) {

? ? ? ? ? ? ? ?super();

? ? ? ? ? ? ? ?this.name = name;

? ? ? ? ? ? ? ?this.age = age;

? ? ? ?}


? ? ? ?private Student(String name) {

? ? ? ? ? ? ? ?this.name = name;

? ? ? ?}


? ? ? ?protected Student(String name,String address) {

? ? ? ? ? ? ? ?this.address = address;

? ? ? ? ? ? ? ?this.name = name;

? ? ? ?}


? ? ? ?Student(int age){

? ? ? ? ? ? ? ?this.age = age;

? ? ? ?}

? ? ? ?public String getName() {

? ? ? ? ? ? ? ?return name;

? ? ? ?}

? ? ? ?public void setName(String name) {

? ? ? ? ? ? ? ?this.name = name;

? ? ? ?}

? ? ? ?public int getAge() {

? ? ? ? ? ? ? ?return age;

? ? ? ?}

? ? ? ?public void setAge(int age) {

? ? ? ? ? ? ? ?this.age = age;

? ? ? ?}

? ? ? ?@Override

? ? ? ?public String toString() {

? ? ? ? ? ? ? ?return "Student [name=" + name + ", age=" + age + ", address=" + address + ", sex=" + sex + "]";

? ? ? ?}

? ? ? ?@Override

? ? ? ?public int hashCode() {

? ? ? ? ? ? ? ?final int prime = 31;

? ? ? ? ? ? ? ?int result = 1;

? ? ? ? ? ? ? ?result = prime * result + age;

? ? ? ? ? ? ? ?result = prime * result + ((name == null) ? 0 : name.hashCode());

? ? ? ? ? ? ? ?return result;

? ? ? ?}

? ? ? ?@Override

? ? ? ?public boolean equals(Object obj) {

? ? ? ? ? ? ? ?if (this == obj)

? ? ? ? ? ? ? ? ? ? ? ?return true;

? ? ? ? ? ? ? ?if (obj == null)

? ? ? ? ? ? ? ? ? ? ? ?return false;

? ? ? ? ? ? ? ?if (getClass() != obj.getClass())

? ? ? ? ? ? ? ? ? ? ? ?return false;

? ? ? ? ? ? ? ?Student other = (Student) obj;

? ? ? ? ? ? ? ?if (age != other.age)

? ? ? ? ? ? ? ? ? ? ? ?return false;

? ? ? ? ? ? ? ?if (name == null) {

? ? ? ? ? ? ? ? ? ? ? ?if (other.name != null)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return false;

? ? ? ? ? ? ? ?} else if (!name.equals(other.name))

? ? ? ? ? ? ? ? ? ? ? ?return false;

? ? ? ? ? ? ? ?return true;

? ? ? ?}

? ? ? ?public String getAddress() {

? ? ? ? ? ? ? ?return address;

? ? ? ?}

? ? ? ?public void setAddress(String address) {

? ? ? ? ? ? ? ?this.address = address;

? ? ? ?}


? ? ? ?public void show() {

? ? ? ? ? ? ? ?System.out.println("我是無參show方法");

? ? ? ?}


? ? ? ?public void method(String s) {

? ? ? ? ? ? ? ?System.out.println("我是帶Sting參數(shù)的method方法:" + s);


? ? ? ?}


? ? ? ?public String concat(int a, String s, double d) {

? ? ? ? ? ? ? ?return a + s + d;

? ? ? ?}


? ? ? ?private void show2() {

? ? ? ? ? ? ? ?System.out.println("我是私有方法");

? ? ? ?}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末月腋,一起剝皮案震驚了整個濱河市瓣赂,隨后出現(xiàn)的幾起案子煌集,更是在濱河造成了極大的恐慌,老刑警劉巖苫纤,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喊废,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)工闺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門陆蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惋增,“玉大人,你說我怎么就攤上這事溪猿∪宜” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵依痊,是天一觀的道長怎披。 經(jīng)常有香客問我,道長性宏,這世上最難降的妖魔是什么状飞? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮酵使,結(jié)果婚禮上焙糟,老公的妹妹穿的比我還像新娘。我一直安慰自己缺脉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布勤揩。 她就那樣靜靜地躺著秘蛔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪负蠕。 梳的紋絲不亂的頭發(fā)上倦畅,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音欲账,去河邊找鬼芭概。 笑死,一個胖子當(dāng)著我的面吹牛踢故,可吹牛的內(nèi)容都是我干的惹苗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼淋纲,長吁一口氣:“原來是場噩夢啊……” “哼触机!你這毒婦竟也來了玷或?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蔬胯,失蹤者是張志新(化名)和其女友劉穎位他,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舞竿,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骗奖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鄙皇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰挣。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖错蝴,靈堂內(nèi)的尸體忽然破棺而出颓芭,到底是詐尸還是另有隱情,我是刑警寧澤馍惹,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布玛界,位于F島的核電站,受9級特大地震影響良狈,放射性物質(zhì)發(fā)生泄漏笨枯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一严嗜、第九天 我趴在偏房一處隱蔽的房頂上張望洲敢。 院中可真熱鬧,春花似錦睦优、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缓醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褪贵,已是汗流浹背抗俄。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工动雹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躲庄。 傳聞我的和親對象是個殘疾皇子钾虐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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