Java核心邏輯 反射PPT幻燈片.ppt_第1頁
Java核心邏輯 反射PPT幻燈片.ppt_第2頁
Java核心邏輯 反射PPT幻燈片.ppt_第3頁
Java核心邏輯 反射PPT幻燈片.ppt_第4頁
Java核心邏輯 反射PPT幻燈片.ppt_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第11章 反射,回顧,網(wǎng)絡(luò)應(yīng)用的結(jié)構(gòu) IP地址與端口號 TCP編程 UDP編程,本章目標(biāo),class對象 獲取class對象的方式 反射包(java.lang.reflect) 反射的作用,本章結(jié)構(gòu),反射,獲取class對象,反射包java.lang.reflect,反射的作用,Class.forName()方法,類名.class,Method類,Field類,class對象概念,getClass()方法,Constructor類,思考,給定一個(gè)對象,要求輸出這個(gè)對象所有的public方法的名稱 public static void printMethod(Object object) 給定一

2、個(gè)字符串參數(shù),這個(gè)參數(shù)表示一個(gè)類的名字。根據(jù) 類名,創(chuàng)建該類的一個(gè)對象并返回 public static Object createObject(String className),class對象,Customer類是客戶的抽象, Customer對象“代表”某個(gè)客戶,但不是某個(gè)客戶。抽象一個(gè)Customer的過程:,public class Customer private String name; private int age; private String address;/ 使用字符串表示的地址無法正確的表示地址 public Customer(String name, int ag

3、e, String address) = name; this.age = age; this.address = address; /省略set、get方法 ,class對象,將address單獨(dú)封裝成一個(gè)類Address,public class Address private String province; private String city; private String street; private int code; public Address(String province, String city, String street, int code)

4、 vince = province; this.city = city; this.street = street; this.code = code; /省略set、get方法 ,class對象,將Customer的address屬性的類型換成Address類型,public class Customer private String name; private int age; private Address address; /將String類型轉(zhuǎn)換成Address類型 public Customer(String name, int age, Address addre

5、ss) = name; this.age = age; this.address = address; /省略set、get方法 ,class對象,如果想抽象一個(gè)Class的信息,那么我們?nèi)缦聛沓橄螅?類中有許多構(gòu)造函數(shù),有許多方法,有許多成員變量,public class Clazz /構(gòu)造方法 private String construtctors;/字符串無法充分表示的表示構(gòu)造方法的信息 /方法 private String methods;/字符串無法充分的表示方法 /成員變量 private String fields;/字符串無法充分的表示成員變量的信息 pu

6、blic Clazz(String construtctors, String methods, String fields) super(); this.construtctors = construtctors; this.methods = methods; this.fields = fields; /省略set、get方法 ,class對象-1,字符串無法充分的表達(dá)各種成員,那么就各成員再次進(jìn)行抽象,/將Clazz中的各成員對象進(jìn)行抽象 class Constructor class Method class Field ,class對象-2,字符串無法充分的表達(dá)各種成員,那么就各成

7、員再次進(jìn)行抽象,public class Clazz private Constructor 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對象,Custom

8、er類是客戶的抽象, Customer對象“代表”某個(gè)客戶,但不是某個(gè)客戶。Clazz類是其他類的抽象,Clazz對象代表其他的類。 Java已經(jīng)為我們提供了這樣一個(gè)類:java.lang.Class,我們無需自己定義Clazz類,通過Class對象我們可以得到: 類繼承自哪個(gè)類 實(shí)現(xiàn)了哪些接口 有哪些屬性 有哪些方法 有哪些構(gòu)造方法 .,獲取class對象的方式,類名.class,Class clazStudent = Student.class; Class clazInt = int.class; Class clazIntArray = int.class;,獲取class對象的方式,

9、getClass()方法,Student student = new Student(); Class clazStudent1 = student.getClass(); Class clazStudent2 = Student.class;,獲取class對象的方式,Class.forName()方法 public static Class forName(String className) throws ClassNotFoundException ,Student student = new Student(); Class clazStudent1 = student.getClas

10、s(); Class clazStudent2 = Student.class; try Class clazStudent3 = Class.forName(Student); catch (ClassNotFoundException e) e.printStackTrace(); ,class對象的作用,getName(): 獲得類的名稱,包括包名 getSimpleName(): 獲得類的名稱,不包括包名 getSuperClass(): 獲得本類的父類的class對象 getInterfaces():獲得本類所實(shí)現(xiàn)的所有接口的class對象,class對象的作用,Class c =

11、ArrayList.class; String className = c.getName(); System.out.println(類名: + className); String simpleName = c.getSimpleName(); System.out.println(簡單類名: + simpleName); Class superClass = c.getSuperclass(); System.out.println(父類: + superClass.getName(); Class interfaces = c.getInterfaces(); System.out.p

12、rintln(接口:); for (int i = 0; i interfaces.length; i+) System.out.println(interfacesi.getName(); ,class對象的作用,public Method getDeclaredMethods() throws SecurityException 取得所有當(dāng)前類聲明的方法,包括public,protected,默認(rèn),private四種訪問權(quán)限的方法,但是不包括繼承的方法 public Method getMethods() throws SecurityException 取得所有public的方法,包括繼

13、承的,接口中聲明的和自己定義的,class對象的作用,public class Student public String name; private int age; static final String KIND = human; protected String schoolName; public Student() public Student(String name,int age) = name; this.age = age; public String getName() return name; public void setName(String n

14、ame) = name; public int getAge() return age; public void setAge(int age) this.age = age; public void publicStudy(int h) 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.pri

15、ntln(調(diào)用friendlyStudy學(xué)習(xí)時(shí)間是: + h); private void privateStudy(int h) System.out.println(調(diào)用privateStudy學(xué)習(xí)時(shí)間是: + h); ,class對象的作用,獲得所有的公開方法,Class clazStudent = Student.class; Method publicMethods = clazStudent.getMethods(); System.out.println(=所有public方法=); for (Method method : publicMethods) System.out.p

16、rintln(method.getName(); ,class對象的作用,獲得所有的本類中定義的方法,Class c = Student.class; Method declaredMethods = c.getDeclaredMethods(); System.out.println(=所有當(dāng)前的類自己定義的方法=); for (Method m : declaredMethods) System.out.println(m.getName(); ,class對象的作用,Field getDeclaredFields() 取得所有當(dāng)前類自己定義的屬性,包括四種訪問權(quán)限的 Field getF

17、ields() 取得所有public的屬性,包括繼承的,接口中聲明的和自己定義的,class對象的作用,獲得所有的公開屬性,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對

18、象的作用,獲得本類中定義的屬性,Class clazStudent = Student.class; 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 =

19、human; protected String schoolName; /省略其他代碼 ,使用class對象創(chuàng)建類的對象,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

20、(IllegalAccessException e) e.printStackTrace(); ,反射包,java.lang.reflect.Field類 通過Class對象的如下方法可以獲得Field對象 Field getDeclaredField(String name) Field getField(String name) Field getDeclaredFields() Field getFields(),Field類的常見方法,getName(),Class c = Student.class; Field nameField; try nameField = c.getDec

21、laredField(name); System.out.println(nameField.getName(); catch (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); ,Field類的常見方法,讀取、設(shè)置屬性 public void set(Object obj, Object value) public Object get(Object obj) Student stu = new Student(); = tom; /修改

22、屬性值,Field類的常見方法,Student student = new Student(); Class clazStudent = student.getClass(); Field nameField; try nameField = clazStudent.getField(name); nameField.set(student, 張三); / 使用field對象讀取屬性 System.out.println(nameField.get(student); / 使用student對象方法讀取屬性 System.out.println(student.getName(); catch

23、 (NoSuchFieldException e) e.printStackTrace(); catch (SecurityException e) e.printStackTrace(); catch (IllegalArgumentException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace(); ,Field類的常見方法,訪問類自己定義的私有屬性 public void setAccessible(boolean flag) Student stu = new Student();

24、 / stu.age = 20; 不能直接修改age屬性,這句代碼將無法編譯通過,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對象讀取屬性 System.out.println(

25、ageField.get(student); / 使用student對象的方法讀取屬性 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(); ,反射包,jav

26、a.lang.reflect.Method類 通過Class對象的如下方法可以獲得Method對象 public Method getDeclaredMethods() public Method getMethods() public Method getMethod(String name, Class parameterTypes) public Method getDeclaredMethod(String name, Class parameterTypes) 紅色位置為變長參數(shù)。,Method類的常見方法,Student類 public void privateStudy(int

27、h) Method m = c.getDeclaredMethod(“privateStudy”, int.class),Method類的常見方法,通過反射調(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è)置 p

28、rivateStudyMethod.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 (In

29、vocationTargetException e) e.printStackTrace(); ,反射包,java.lang.reflect.Constructor 類 通過Class對象的如下方法可以獲得Constructor對象 Constructor getConstructors() 取得public的構(gòu)造函數(shù) Constructor getDeclaredConstructors() 取得所有的構(gòu)造函數(shù) Constructor getConstructor(Class parameters) Constructor getDeclaredConstructor(Class param

30、eters),反射包,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 (NoSuchMethodException e) e.printSta

31、ckTrace(); 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(); catch (Instantiatio

32、nException e) e.printStackTrace(); ,反射的作用,應(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.class); m.invoke(o , 12);,反射案例-1,Anim

33、al類,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; ,反射案例-2,Bird類,public class Bird

34、 extends Animal public Bird(String name) super(name); Override public void shout() System.out.println( + this.getName() + 小鳥,在唧唧喳喳叫.); Override public void eat() System.out.println( + this.getName() + 小鳥,早吃蟲子.); ,反射案例-3,Cat類,public class Cat extends Animal public Cat(String name) super(name); Overri

35、de public void shout() System.out.println( + this.getName() + 小貓,在喵喵叫.); Override public void eat() System.out.println( + this.getName() + 小貓,在吃魚.); ,反射案例-4,Dog類,public class Dog extends Animal public Dog(String name) super(name); Override public void shout() System.out.println( + this.getName() + 小狗,在汪汪叫.); Override public void eat() System.out.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論