版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城中村兒童游樂設(shè)施建設(shè)方案
- 環(huán)保材料采購與使用方案
- 市政工程造價(jià)控制方案
- 道路施工材料運(yùn)輸管理方案
- 建材采購決策支持系統(tǒng)方案
- 2026年法律實(shí)務(wù)案例解析與練習(xí)
- 2026年現(xiàn)代城市交通規(guī)劃與管理策略題庫
- 2026年稅務(wù)籌劃師資格考核模擬題集
- 2026年國際貿(mào)易規(guī)則與實(shí)務(wù)考試模擬題庫
- 2026年法律常識題庫合同法要點(diǎn)及案例分析
- GB/T 45629.1-2025信息技術(shù)數(shù)據(jù)中心設(shè)備和基礎(chǔ)設(shè)施第1部分:通用概念
- 2025年中考?xì)v史開卷考查范圍重大考點(diǎn)全突破(完整版)
- 學(xué)術(shù)誠信與學(xué)術(shù)規(guī)范研究-深度研究
- 《ETF相關(guān)知識培訓(xùn)》課件
- (一模)烏魯木齊地區(qū)2025年高三年級第一次質(zhì)量英語試卷(含答案)
- 2025年云南省普洱市事業(yè)單位招聘考試(833人)高頻重點(diǎn)提升(共500題)附帶答案詳解
- DB15-T 3677-2024 大興安嶺林區(qū)白樺樹汁采集技術(shù)規(guī)程
- 2024年《13464電腦動(dòng)畫》自考復(fù)習(xí)題庫(含答案)
- 義務(wù)教育階段學(xué)生語文核心素養(yǎng)培養(yǎng)的思考與實(shí)踐
- 綜合利用1噸APT渣項(xiàng)目研究報(bào)告樣本
- JT-T 1495-2024 公路水運(yùn)危險(xiǎn)性較大工程專項(xiàng)施工方案編制審查規(guī)程
評論
0/150
提交評論