Java核心邏輯第11章反射_第1頁(yè)
Java核心邏輯第11章反射_第2頁(yè)
Java核心邏輯第11章反射_第3頁(yè)
Java核心邏輯第11章反射_第4頁(yè)
Java核心邏輯第11章反射_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論