




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java核心邏輯第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()方法方法類名類名.classMethod類類Field類類class對(duì)象概念對(duì)象概念getClass()方法方法Constructor類類思考思考l 給定一個(gè)對(duì)象
2、,要求輸出這個(gè)對(duì)象所有的給定一個(gè)對(duì)象,要求輸出這個(gè)對(duì)象所有的public方法的名方法的名稱稱public static void printMethod(Object object)l 給定一個(gè)字符串參數(shù),這個(gè)參數(shù)表示一個(gè)類的名字。根據(jù)給定一個(gè)字符串參數(shù),這個(gè)參數(shù)表示一個(gè)類的名字。根據(jù) 類名,創(chuàng)建該類的一個(gè)對(duì)象并返回類名,創(chuàng)建該類的一個(gè)對(duì)象并返回public static Object createObject(String className)class對(duì)象對(duì)象l Customer類是客戶的抽象,類是客戶的抽象, Customer對(duì)象對(duì)象“代表代表”某某個(gè)客戶,但不是某個(gè)客戶。抽象一個(gè)個(gè)客戶
3、,但不是某個(gè)客戶。抽象一個(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è)類單獨(dú)封裝成一個(gè)類Addresspubli
4、c class 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屬性的類型換成屬性
5、的類型換成Address類型類型public class Customer private String name;private int age;private Address address; /將String類型轉(zhuǎn)換成Address類型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)抽象
6、:類中有許多構(gòu)造函數(shù),有許多方法,有許多成員變量類中有許多構(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 = c
7、onstrutctors;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 Construct
8、or constructors; /構(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類是客戶的抽象,類是客戶的抽象, Customer對(duì)象對(duì)象“代表代表”某個(gè)客戶,但不是某個(gè)客戶
9、某個(gè)客戶,但不是某個(gè)客戶。Clazz類是其他類的抽象,類是其他類的抽象,Clazz對(duì)象代表其他的類。對(duì)象代表其他的類。lJava已經(jīng)為我們提供了這樣一個(gè)類:,我們無(wú)需自己定義已經(jīng)為我們提供了這樣一個(gè)類:,我們無(wú)需自己定義Clazz類,通過(guò)類,通過(guò)Class對(duì)象我們可以得到:對(duì)象我們可以得到:類繼承自哪個(gè)類類繼承自哪個(gè)類實(shí)現(xiàn)了哪些接口實(shí)現(xiàn)了哪些接口有哪些屬性有哪些屬性有哪些方法有哪些方法有哪些構(gòu)造方法有哪些構(gòu)造方法.獲取獲取class對(duì)象的方式對(duì)象的方式l 類名類名.classClass clazStudent = Student.class;Class clazInt = int.class;
10、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 Student stu
11、dent = 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(): 獲得類的名稱,包括包名獲得類的名稱,包括包名lgetSimpleName(): 獲得類的名稱,不包括包名獲得類的名稱,不包括包名lgetSuperCl
12、ass(): 獲得本類的父類的獲得本類的父類的class對(duì)象對(duì)象lgetInterfaces():獲得本類所實(shí)現(xiàn)的所有接口的獲得本類所實(shí)現(xiàn)的所有接口的class對(duì)象對(duì)象class對(duì)象的作用對(duì)象的作用Class c = ArrayList.class;String className = c.getName();System.out.println(類名: + className);String simpleName = c.getSimpleName();System.out.println(簡(jiǎn)單類名: + simpleName);Class superClass = c.getSupercl
13、ass();System.out.println(父類: + 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)前類聲明的方法,包括取得所有當(dāng)前類聲明的方法,包
14、括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;protected Stri
15、ng 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) System.out
16、.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、開方法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 獲得所有的本類中定義的方法獲得所有的本類中定義的方法Class c = Student.class;Method declaredMethods = c.getDeclaredMetho
18、ds();System.out.println(=所有當(dāng)前的類自己定義的方法=);for (Method m : declaredMethods) System.out.println(m.getName();class對(duì)象的作用對(duì)象的作用l Field getDeclaredFields()l取得所有當(dāng)前類自己定義的屬性,包括四種訪問(wèn)權(quán)限的取得所有當(dāng)前類自己定義的屬性,包括四種訪問(wèn)權(quán)限的l Field getFields()l取得所有取得所有public的屬性,包括繼承的,接口中聲明的和自的屬性,包括繼承的,接口中聲明的和自己定義的己定義的class對(duì)象的作用對(duì)象的作用l 獲得所有的公開屬性
19、獲得所有的公開屬性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 獲得本類中定義的屬性獲得本類中定義的屬性Class clazStudent = Student.cla
20、ss;Field declaredFields = clazStudent.getDeclaredFields();System.out.println(=獲取當(dāng)前類自己定義的屬性=);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;/省略其他代碼使用使用class對(duì)象創(chuàng)建
21、類的對(duì)象對(duì)象創(chuàng)建類的對(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.printStackTrace();反射包反射
22、包l類類通過(guò)通過(guò)Class對(duì)象的如下方法可以獲得對(duì)象的如下方法可以獲得Field對(duì)象對(duì)象Field getDeclaredField(String name)Field getField(String name)Field getDeclaredFields() Field getFields()Field類的常見方法類的常見方法l getName()Class c = Student.class;Field nameField;try nameField = c.getDeclaredField(name);System.out.println(nameField.getName(); ca
23、tch (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace();Field類的常見方法類的常見方法l 讀取、設(shè)置屬性讀取、設(shè)置屬性lpublic void set(Object obj, Object value)lpublic Object get(Object obj)Student stu = new Student(); = tom; /修改屬性值修改屬性值 Field類的常見方法類的常見方法Student student = new St
24、udent();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 (NoSuchFieldException e) e.printStackTrace(); c
25、atch (SecurityException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace();Field類的常見方法類的常見方法l訪問(wèn)類自己定義的私有屬性訪問(wèn)類自己定義的私有屬性lpublic void setAccessible(boolean flag)Student stu = new Student();/ stu.age = 20; 不能直接修改不能直接修改age屬性
26、,這句代碼將無(wú)法編譯通過(guò)屬性,這句代碼將無(wú)法編譯通過(guò)Field類的常見方法類的常見方法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ì)象讀取屬性System.out.println(ageField.get(stude
27、nt);/ 使用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.printStackTrace();反射包反射包l類類通過(guò)通過(guò)Class對(duì)象的如下方法可以獲得
28、對(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 Student類類public void privateStudy(int h)Method m = c.
29、getDeclaredMethod(“privateStudy”, int.class)Method類的常見方法類的常見方法l 通過(guò)反射調(diào)用方法通過(guò)反射調(diào)用方法Method.invoke(Object,Object);Student student = new Student();Class clazStudent = student.getClass();try Method privateStudyMethod = clazStudent.getDeclaredMethod(privateStudy, int.class);/ 調(diào)用的方法是public的,就不需要進(jìn)行設(shè)置privateSt
30、udyMethod.setAccessible(true);privateStudyMethod.invoke(student, 24); catch (NoSuchMethodException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InvocationT
31、argetException e) e.printStackTrace();反射包反射包l java.lang.reflect.Constructor 類類通過(guò)通過(guò)Class對(duì)象的如下方法可以獲得對(duì)象的如下方法可以獲得Constructor對(duì)象對(duì)象 Constructor getConstructors() 取得取得public的構(gòu)造函數(shù)的構(gòu)造函數(shù) Constructor getDeclaredConstructors() 取得所有的構(gòu)造函取得所有的構(gòu)造函數(shù)數(shù) Constructor getConstructor(Class parameters) Constructor getDeclare
32、dConstructor(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.out.println(該學(xué)生的年齡是 + student.getAge(); catch (NoSuchMethodEx
33、ception e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (InvocationTargetException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace()
34、; 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 methodName = “publicStudy;Method m = c.getMethod(methodName , int.cl
35、ass);m.invoke(o , 12);反射案例反射案例-1l Animal類類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() return name;public void setName(String name) = name;反
36、射案例反射案例-2lBird類類public class Bird extends Animal public Bird(String name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小鳥,在唧唧喳喳叫.);Overridepublic void eat() System.out.println( + this.getName() + 小鳥,早吃蟲子.);反射案例反射案例-3lCat類類public class Cat extends Animal public Cat(S
37、tring name) super(name);Overridepublic void shout() System.out.println( + this.getName() + 小貓,在喵喵叫.);Overridepublic void eat() System.out.println( + this.getName() + 小貓,在吃魚.);反射案例反射案例-4lDog類類public class Dog extends Animal public Dog(String name) super(name);Overridepublic void shout() System.out.println( + this.getName()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度物流信息承運(yùn)合同模板
- 二零二五年度承攬合同中增值稅稅率變動(dòng)應(yīng)對(duì)策略
- 二零二五年度交通事故人傷賠償公益援助協(xié)議
- 二零二五年度農(nóng)村宅基地租賃協(xié)議(現(xiàn)代農(nóng)業(yè)科技示范園)
- 2025年度新能源汽車抵押貸款服務(wù)合同
- 二零二五年度企業(yè)自然人委托經(jīng)營(yíng)管理合作協(xié)議
- 二零二五年度在線游戲運(yùn)營(yíng)免責(zé)協(xié)議書
- 2025年度高校與用人單位就業(yè)質(zhì)量監(jiān)控合作協(xié)議
- 2025年度旅游景區(qū)特色商鋪?zhàn)赓U合同
- 二零二五年度挖機(jī)租賃市場(chǎng)拓展與品牌合作協(xié)議
- 人教版數(shù)學(xué)二年級(jí)下冊(cè)全冊(cè)核心素養(yǎng)目標(biāo)教學(xué)設(shè)計(jì)
- 2024年廣州港集團(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- 【特級(jí)教師上優(yōu)課】《黃河頌》名師課件
- 鋁合金門窗安裝施工工藝詳解
- 《包裝設(shè)計(jì)》課件-包裝設(shè)計(jì)發(fā)展的歷史
- 全國(guó)保密宣傳教育月課件
- 醫(yī)療器械經(jīng)營(yíng)企業(yè)GSP培訓(xùn)
- 手術(shù)出血量的評(píng)估
- 語(yǔ)言藝術(shù)訓(xùn)練智慧樹知到期末考試答案2024年
- 報(bào)價(jià)單(產(chǎn)品報(bào)價(jià)單)
- 內(nèi)鏡逆行闌尾炎治療術(shù)
評(píng)論
0/150
提交評(píng)論