![Java核心邏輯第11章反射_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/ee145da3-6802-417b-8b03-6895afa0ae40/ee145da3-6802-417b-8b03-6895afa0ae401.gif)
![Java核心邏輯第11章反射_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/ee145da3-6802-417b-8b03-6895afa0ae40/ee145da3-6802-417b-8b03-6895afa0ae402.gif)
![Java核心邏輯第11章反射_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/ee145da3-6802-417b-8b03-6895afa0ae40/ee145da3-6802-417b-8b03-6895afa0ae403.gif)
![Java核心邏輯第11章反射_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/ee145da3-6802-417b-8b03-6895afa0ae40/ee145da3-6802-417b-8b03-6895afa0ae404.gif)
![Java核心邏輯第11章反射_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/9/ee145da3-6802-417b-8b03-6895afa0ae40/ee145da3-6802-417b-8b03-6895afa0ae405.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第11章章 反射反射回顧回顧l網(wǎng)絡(luò)應(yīng)用的結(jié)構(gòu)網(wǎng)絡(luò)應(yīng)用的結(jié)構(gòu)l IP地址與端口號(hào)地址與端口號(hào)l TCP編程編程l UDP編程編程本章目標(biāo)本章目標(biāo)l class對(duì)象對(duì)象l 獲取獲取class對(duì)象的方式對(duì)象的方式l 反射包反射包(java.lang.reflect)l 反射的作用反射的作用本章結(jié)構(gòu)本章結(jié)構(gòu)反射反射獲取獲取class對(duì)象對(duì)象反射包反射包java.lang.reflect反射的作用反射的作用Class.forName()方法方法類(lèi)名類(lèi)名.classMethod類(lèi)類(lèi)Field類(lèi)類(lèi)class對(duì)象概念對(duì)象概念getClass()方法方法Constructor類(lèi)類(lèi)思考思考l 給定一個(gè)對(duì)象,要求
2、輸出這個(gè)對(duì)象所有的給定一個(gè)對(duì)象,要求輸出這個(gè)對(duì)象所有的public方法的名方法的名稱(chēng)稱(chēng)public static void printMethod(Object object)l 給定一個(gè)字符串參數(shù),這個(gè)參數(shù)表示一個(gè)類(lèi)的名字。根據(jù)給定一個(gè)字符串參數(shù),這個(gè)參數(shù)表示一個(gè)類(lèi)的名字。根據(jù) 類(lèi)名,創(chuàng)建該類(lèi)的一個(gè)對(duì)象并返回類(lèi)名,創(chuàng)建該類(lèi)的一個(gè)對(duì)象并返回public static Object createObject(String className)class對(duì)象對(duì)象l Customer類(lèi)是客戶(hù)的類(lèi)是客戶(hù)的抽象抽象, Customer對(duì)象對(duì)象“代表代表”某某個(gè)客戶(hù),但不是某個(gè)客戶(hù)。抽象一個(gè)個(gè)客戶(hù),但不是
3、某個(gè)客戶(hù)。抽象一個(gè)Customer的過(guò)程:的過(guò)程:public class Customer private String name;private int age;private String address;/ 使用字符串表示的地址無(wú)法正確的表示地址public Customer(String name, int age, String address) = name;this.age = age;this.address = address;/省略set、get方法class對(duì)象對(duì)象l 將將address單獨(dú)封裝成一個(gè)類(lèi)單獨(dú)封裝成一個(gè)類(lèi)Addresspublic cl
4、ass Address private String province;private String city;private String street;private int code;public Address(String province, String city, String street, int code) vince = province;this.city = city;this.street = street;this.code = code;/省略set、get方法class對(duì)象對(duì)象l 將將Customer的的address屬性的類(lèi)型換成屬性的類(lèi)型換
5、成Address類(lèi)型類(lèi)型public class Customer private String name;private int age;private Address address; /將String類(lèi)型轉(zhuǎn)換成Address類(lèi)型public Customer(String name, int age, Address address) = name;this.age = age;this.address = address;/省略set、get方法class對(duì)象對(duì)象l 如果想抽象一個(gè)如果想抽象一個(gè)Class的信息,那么我們?nèi)缦聛?lái)抽象:的信息,那么我們?nèi)缦聛?lái)抽象:類(lèi)中有
6、許多構(gòu)造函數(shù),有許多方法,有許多成員變量類(lèi)中有許多構(gòu)造函數(shù),有許多方法,有許多成員變量public class Clazz /構(gòu)造方法private String construtctors;/字符串無(wú)法充分表示的表示構(gòu)造方法的信息/方法private String methods;/字符串無(wú)法充分的表示方法/成員變量private String fields;/字符串無(wú)法充分的表示成員變量的信息public Clazz(String construtctors, String methods, String fields) super();this.construtctors = const
7、rutctors;this.methods = methods;this.fields = fields;/省略set、get方法class對(duì)象對(duì)象-1l 字符串無(wú)法充分的表達(dá)各種成員,那么就各成員再次進(jìn)行字符串無(wú)法充分的表達(dá)各種成員,那么就各成員再次進(jìn)行抽象抽象/將Clazz中的各成員對(duì)象進(jìn)行抽象class Constructor class Method class Field class對(duì)象對(duì)象-2l 字符串無(wú)法充分的表達(dá)各種成員,那么就各成員再次進(jìn)行字符串無(wú)法充分的表達(dá)各種成員,那么就各成員再次進(jìn)行抽象抽象public class Clazz private Constructor c
8、onstructors; /構(gòu)造方法private Method methods; /方法private Field fields; /成員變量public Clazz(Constructor constructors, Method methods, Field fields) this.constructors = constructors;this.methods = methods;this.fields = fields;/省略set、get方法class對(duì)象對(duì)象l Customer類(lèi)是客戶(hù)的類(lèi)是客戶(hù)的抽象抽象, Customer對(duì)象對(duì)象“代表代表”某個(gè)客戶(hù),但某個(gè)客戶(hù),但不是某個(gè)客
9、戶(hù)。不是某個(gè)客戶(hù)。Clazz類(lèi)是其他類(lèi)的類(lèi)是其他類(lèi)的抽象抽象,Clazz對(duì)象對(duì)象代表代表其他的類(lèi)。其他的類(lèi)。lJava已經(jīng)為我們提供了這樣一個(gè)類(lèi):已經(jīng)為我們提供了這樣一個(gè)類(lèi):java.lang.Class,我們無(wú)需自己,我們無(wú)需自己定義定義Clazz類(lèi),通過(guò)類(lèi),通過(guò)Class對(duì)象我們可以得到:對(duì)象我們可以得到:類(lèi)繼承自哪個(gè)類(lèi)類(lèi)繼承自哪個(gè)類(lèi)實(shí)現(xiàn)了哪些接口實(shí)現(xiàn)了哪些接口有哪些屬性有哪些屬性有哪些方法有哪些方法有哪些構(gòu)造方法有哪些構(gòu)造方法.獲取獲取class對(duì)象的方式對(duì)象的方式l 類(lèi)名類(lèi)名.classClass clazStudent = Student.class;Class clazInt =
10、int.class;Class clazIntArray = int.class;獲取獲取class對(duì)象的方式對(duì)象的方式l getClass()方法方法Student student = new Student();Class clazStudent1 = student.getClass();Class clazStudent2 = Student.class;獲取獲取class對(duì)象的方式對(duì)象的方式l Class.forName()方法方法public static Class forName(String className) throws ClassNotFoundException S
11、tudent student = new Student();Class clazStudent1 = student.getClass();Class clazStudent2 = Student.class;try Class clazStudent3 = Class.forName(Student); catch (ClassNotFoundException e) e.printStackTrace();class對(duì)象的作用對(duì)象的作用lgetName(): 獲得類(lèi)的名稱(chēng),包括包名獲得類(lèi)的名稱(chēng),包括包名lgetSimpleName(): 獲得類(lèi)的名稱(chēng),不包括包名獲得類(lèi)的名稱(chēng),不包括包名l
12、getSuperClass(): 獲得本類(lèi)的父類(lèi)的獲得本類(lèi)的父類(lèi)的class對(duì)象對(duì)象lgetInterfaces():獲得本類(lèi)所實(shí)現(xiàn)的所有接口的獲得本類(lèi)所實(shí)現(xiàn)的所有接口的class對(duì)象對(duì)象class對(duì)象的作用對(duì)象的作用Class c = ArrayList.class;String className = c.getName();System.out.println(類(lèi)名: + className);String simpleName = c.getSimpleName();System.out.println(簡(jiǎn)單類(lèi)名: + simpleName);Class superClass = c.
13、getSuperclass();System.out.println(父類(lèi): + superClass.getName();Class interfaces = c.getInterfaces();System.out.println(接口:);for (int i = 0; i interfaces.length; i+) System.out.println(interfacesi.getName();class對(duì)象的作用對(duì)象的作用lpublic Method getDeclaredMethods() throws SecurityExceptionl取得所有當(dāng)前類(lèi)聲明的方法,包括取得所有
14、當(dāng)前類(lèi)聲明的方法,包括public,protected,默認(rèn),默認(rèn),private四種訪問(wèn)權(quán)限的方法,但是四種訪問(wèn)權(quán)限的方法,但是不包括繼承的不包括繼承的方方法法lpublic Method getMethods() throws SecurityExceptionl取得所有取得所有public的方法,包括繼承的,接口中聲明的和自的方法,包括繼承的,接口中聲明的和自己定義的己定義的class對(duì)象的作用對(duì)象的作用public class Student public String name;private int age;static final String KIND = human;prot
15、ected String schoolName;public Student() public Student(String name,int age) = name;this.age = age;public String getName() return name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public void publicStudy(int h)
16、System.out.println(調(diào)用publicStudy學(xué)習(xí)時(shí)間是: + h);protected void protectedStudy(int h) System.out.println(調(diào)用protectedStudy學(xué)習(xí)時(shí)間是: + h);void friendlyStudy(int h) System.out.println(調(diào)用friendlyStudy學(xué)習(xí)時(shí)間是: + h);private void privateStudy(int h) System.out.println(調(diào)用privateStudy學(xué)習(xí)時(shí)間是: + h);class對(duì)象的作用對(duì)象的作用l 獲得所有的
17、公開(kāi)方法獲得所有的公開(kāi)方法Class clazStudent = Student.class;Method publicMethods = clazStudent.getMethods();System.out.println(=所有public方法=);for (Method method : publicMethods) System.out.println(method.getName();class對(duì)象的作用對(duì)象的作用l 獲得所有的本類(lèi)中定義的方法獲得所有的本類(lèi)中定義的方法Class c = Student.class;Method declaredMethods = c.getDec
18、laredMethods();System.out.println(=所有當(dāng)前的類(lèi)自己定義的方法=);for (Method m : declaredMethods) System.out.println(m.getName();class對(duì)象的作用對(duì)象的作用l Field getDeclaredFields()l取得所有當(dāng)前類(lèi)取得所有當(dāng)前類(lèi)自己定義自己定義的屬性,包括的屬性,包括四種訪問(wèn)權(quán)限四種訪問(wèn)權(quán)限的的l Field getFields()l取得所有取得所有public的屬性,包括繼承的,接口中聲明的和自的屬性,包括繼承的,接口中聲明的和自己定義的己定義的class對(duì)象的作用對(duì)象的作用l
19、 獲得所有的公開(kāi)屬性獲得所有的公開(kāi)屬性Class c = Student.class;Field publicMethods = c.getFields();System.out.println(=所有public屬性=);for (Field field : publicMethods) System.out.println(field.getName();public class Student public String name;private int age;/其他代碼class對(duì)象的作用對(duì)象的作用l 獲得本類(lèi)中定義的屬性獲得本類(lèi)中定義的屬性Class clazStudent = S
20、tudent.class;Field declaredFields = clazStudent.getDeclaredFields();System.out.println(=獲取當(dāng)前類(lèi)自己定義的屬性=);for (Field field : declaredFields) System.out.println(field.getName();public class Student public String name;private int age;static final String KIND = human;protected String schoolName;/省略其他代碼使用使
21、用class對(duì)象創(chuàng)建類(lèi)的對(duì)象對(duì)象創(chuàng)建類(lèi)的對(duì)象l Object newInstance()Class clazStudent = Student.class;Student student;try student = clazStudent.newInstance();student.setName(zhangsan);System.out.println(student.getName(); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTra
22、ce();反射包反射包l java.lang.reflect.Field類(lèi)類(lèi)通過(guò)通過(guò)Class對(duì)象的如下方法可以獲得對(duì)象的如下方法可以獲得Field對(duì)象對(duì)象Field getDeclaredField(String name)Field getField(String name)Field getDeclaredFields() Field getFields()Field類(lèi)的常見(jiàn)方法類(lèi)的常見(jiàn)方法l getName()Class c = Student.class;Field nameField;try nameField = c.getDeclaredField(name);System.o
23、ut.println(nameField.getName(); catch (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace();Field類(lèi)的常見(jiàn)方法類(lèi)的常見(jiàn)方法l 讀取、設(shè)置屬性讀取、設(shè)置屬性lpublic void set(Object obj, Object value)lpublic Object get(Object obj)Student stu = new Student(); = tom; /修改屬性值修改屬性值 Field類(lèi)的
24、常見(jiàn)方法類(lèi)的常見(jiàn)方法Student student = new Student();Class clazStudent = student.getClass();Field nameField;try nameField = clazStudent.getField(name);nameField.set(student, 張三);/ 使用field對(duì)象讀取屬性System.out.println(nameField.get(student);/ 使用student對(duì)象方法讀取屬性System.out.println(student.getName(); catch (NoSuchFieldE
25、xception e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace();Field類(lèi)的常見(jiàn)方法類(lèi)的常見(jiàn)方法l訪問(wèn)類(lèi)自己定義的私有屬性訪問(wèn)類(lèi)自己定義的私有屬性lpublic void setAccessible(boolean flag)Student stu = new Student()
26、;/ stu.age = 20; 不能直接修改不能直接修改age屬性,這句代碼將無(wú)法編譯通過(guò)屬性,這句代碼將無(wú)法編譯通過(guò)Field類(lèi)的常見(jiàn)方法類(lèi)的常見(jiàn)方法Student student = new Student();Class clazStudent = student.getClass();Field ageField;try ageField = clazStudent.getDeclaredField(age);/ 可以操作私有屬性,至關(guān)重要ageField.setAccessible(true);ageField.set(student, 20);/ 使用field對(duì)象讀取屬性Sys
27、tem.out.println(ageField.get(student);/ 使用student對(duì)象的方法讀取屬性System.out.println(student.getAge(); catch (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTra
28、ce();反射包反射包l java.lang.reflect.Method類(lèi)類(lèi)通過(guò)通過(guò)Class對(duì)象的如下方法可以獲得對(duì)象的如下方法可以獲得Method對(duì)象對(duì)象public Method getDeclaredMethods() public Method getMethods()public Method getMethod(String name, Class parameterTypes) public Method getDeclaredMethod(String name, Class parameterTypes)紅色位置為變長(zhǎng)參數(shù)。紅色位置為變長(zhǎng)參數(shù)。Method類(lèi)的常見(jiàn)方法類(lèi)的
29、常見(jiàn)方法l Student類(lèi)類(lèi)public void privateStudy(int h)Method m = c.getDeclaredMethod(“privateStudy”, int.class)Method類(lèi)的常見(jiàn)方法類(lèi)的常見(jiàn)方法l 通過(guò)反射調(diào)用方法通過(guò)反射調(diào)用方法Method.invoke(Object,Object);Student student = new Student();Class clazStudent = student.getClass();try Method privateStudyMethod = clazStudent.getDeclaredMethod
30、(privateStudy, int.class);/ 調(diào)用的方法是public的,就不需要進(jìn)行設(shè)置privateStudyMethod.setAccessible(true);privateStudyMethod.invoke(student, 24); catch (NoSuchMethodException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (IllegalA
31、rgumentException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace();反射包反射包l java.lang.reflect.Constructor 類(lèi)類(lèi)通過(guò)通過(guò)Class對(duì)象的如下方法可以獲得對(duì)象的如下方法可以獲得Constructor對(duì)象對(duì)象 Constructor getConstructors() 取得取得public的構(gòu)造函的構(gòu)造函數(shù)數(shù) Constructor getDeclaredConstructors() 取得取得所有所有的的構(gòu)造函數(shù)構(gòu)造函數(shù) Construc
32、tor getConstructor(Class parameters) Constructor getDeclaredConstructor(Class parameters)反射包反射包try Class clazStudent = Class.forName(chp16.ex08.Student);Constructor constructor = clazStudent.getConstructor(String.class, int.class);Student student = (Student) constructor.newInstance(張三, 24);System.ou
33、t.println(該學(xué)生的年齡是 + student.getAge(); catch (NoSuchMethodException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTr
34、ace(); catch (ClassNotFoundException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace();反射的作用反射的作用l 應(yīng)用反射的代碼,增加程序的通用性應(yīng)用反射的代碼,增加程序的通用性Student s = new Student();s.study();String className = Student;Class c = Class.forName(className);Object o = c.newInstance(); String methodNam
35、e = “publicStudy;Method m = c.getMethod(methodName , int.class);m.invoke(o , 12);反射案例反射案例-1l Animal類(lèi)類(lèi)public abstract class Animal private String name;public Animal(String name) = name;/* * 動(dòng)物叫 */public abstract void shout();/* * 動(dòng)物吃 */public abstract void eat();public String getName() retu
36、rn name;public void setName(String name) = name;反射案例反射案例-2lBird類(lèi)類(lèi)public class Bird extends Animal public Bird(String name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小鳥(niǎo),在唧唧喳喳叫.);Overridepublic void eat() System.out.println( + this.getName() + 小鳥(niǎo),早吃蟲(chóng)子.);反
37、射案例反射案例-3lCat類(lèi)類(lèi)public class Cat extends Animal public Cat(String name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小貓,在喵喵叫.);Overridepublic void eat() System.out.println( + this.getName() + 小貓,在吃魚(yú).);反射案例反射案例-4lDog類(lèi)類(lèi)public class Dog extends Animal public Dog(String name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小狗,在汪汪叫.);Over
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中外電影制片合作合同模板大全
- 2025年餐飲業(yè)廚余垃圾處理合作協(xié)議
- 專(zhuān)利權(quán)轉(zhuǎn)讓合同參考模板
- 2025年安保與清潔綜合服務(wù)協(xié)議書(shū)
- 上市公司股權(quán)激勵(lì)合同樣本
- 個(gè)人承包科研項(xiàng)目合同模板
- 個(gè)人與公司技術(shù)入股合同全文
- 中外合資研發(fā)合同書(shū)范本
- 個(gè)人委托代理合同范本
- 人事代理合同模板:正式合同范本
- 沖壓模具價(jià)格估算方法
- Before Sunrise 愛(ài)在黎明破曉時(shí)
- MotionView-MotionSolve應(yīng)用技巧與實(shí)例分析
- 碳納米管應(yīng)用研究
- 投標(biāo)聲明書(shū)模板
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十一章運(yùn)動(dòng)技能的練習(xí)
- 蟲(chóng)洞書(shū)簡(jiǎn)全套8本
- 2023年《反電信網(wǎng)絡(luò)詐騙法》專(zhuān)題普法宣傳
- 小學(xué)數(shù)學(xué)五年級(jí)上、下冊(cè)口算題大全
- 和平精英電競(jìng)賽事
- 高標(biāo)準(zhǔn)農(nóng)田施工組織設(shè)計(jì)(全)
評(píng)論
0/150
提交評(píng)論