第十三章 java反射機制
1.如何創建Class的實例
1.1過程:源文件經過編譯(javac.exe)後,得到一個或多個.class文件, .class文件經過運行(java.exe),就需要進行類的加載(通過JVM的類的加載器),記載到內存中的緩存,每一個放入緩存中的.class文件就是一個Class的實例
1.2Class的一個對象,對應着一個運行時類,相當於一個運行時類本身充當了Class的一個實例。
1.3java.long.Class是反射的源頭。接下類涉及到反射的類都在java.long.reflect子包下。
1.4實例化Class的方法:
①調用運行時類的.class屬性
Class clazz = Person.class
②通過運行時類的對象,調用其getClass()方法
Person p = new Person;
Class clazz = p.getClass();
③調用Class的靜態方法forName(String className) 。此方法報ClassNotFoundException
String className = "person";
Class clazz = Class.forName(className);
2.有了Class實例以後,可以做什麼
2.1創建對應的運行時類的對象
①調用無參構造器創建
Object obj = Class.newInstance();
Person p = (Person)obj;
②調用指定構造器創建(帶參,非public--->Declared)
Constructor cons = clazz.getDeclaredConstuctor(形參類型.class,形參類型.class 等等);
cons.setAccessible(true);
Person p = (Person)cons.newInstance("Tom",10);
2.2調用查詢獲取對應的運行時類的完整的類的結構:屬性、方法、構造器、包、父類、接口、泛型、註解、異常、內部類
如:Method[] m1 = clazz.getMethods();獲取到對應的運行時類中聲明的權限爲public的方法(包含父類中聲明的public方法)
Method[] m2 = clazz.getDeclaredMethods();獲取到對應的運行時類中所有的方法(不含父類)
2.3調用對應的運行時類中指定的結構(某個指定的屬性、方法、構造器)
①調用指定屬性
非public屬性:
Field f1 = clazz.getDeclaredField("name");//屬性名
f1.setAccessible(true);
f1.set(a,“Jerry”);//對象 屬性
public屬性:
Field f2 = clazz.getField("age");//屬性名
f2.set(a,9);//對象 屬性
static屬性:
Field f3 = clazz.getDeclaredField("desc");//屬性名
f3.get(null/對象/類名.class);
②調用指定方法:
調用非public方法:
Method m1 = clazz.getDeclaredMethod("getAge");//方法名 形參類型
m1.setAccessible(true);
int age = (Integer)m1.invoke(p);//方法的返回值類型 名稱 obj,args對象 形參或無
調用public方法:
Method m2 = clazz.getMethod("show",String.class);//方法名 形參類型
Object returnVal = m2.invoke(p,"帥哥");//對象 形參 返回值爲方法的
調用static方法:
Method m3 = clazz.getDeclaredMethod("getAge");//方法名 形參類型
m3.setAccessible(true);
m3.invoke(p/Person.class/null);//對象 類 null
3.java動態代理
代理模式設計原理:使用一個代理將對象包裝起來,然後用該代理對象取代原始對象,任何對原始對象的調用都要通過代理,代理對象決定是否以及何時將方法調用轉到
原始對象上
靜態代理:要求被代理類和代理類同時實現相應的一套接口,通過代理類的對象調用重寫接口的方法時,實際上執行的是被代理類的同樣的方法的調用。
動態代理:在程序運行時,根據被代理類及其實現的接口,動態的創建一個代理類,當調用代理類的實現的抽象方法時,就發起對被代理類同樣的方法的調用
涉及到的技術點:
①提供一個實現了InvocationHandler接口實現類,並重寫其invoke()方法
②Proxy.newInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),h);//obj:被代理類對象 h:實現了InvocationHandler接口實現類的對象
動態代理與AOP
第十四章 網絡編程
1.要想實現網絡傳輸,需要考慮的問題有哪些?
1.1如何才能準確的定位網絡上的一臺主機?
1.2如何才能進行可靠的、高效的數據傳輸?
2.Java如何實現的網絡通信
2.1使用IP地址---定位一臺主機 使用端口號---定位一個應用 ===>InetAddress類
如何創建一個InetAddress的對象?getByName(**);比如:InetAddress Inet = InetAddress.getByName(*192.168.10.165*);
如何創建本機的一個InetAddress的對象?getLocalHost()
域名:getHostName() IP:getHostAddress()
2.2對應有協議:
OSI參考模型:應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層
TCP/IP參考模型:應用層 傳輸層 網絡層 物理+數據鏈路層
對於傳輸層而言:
TCP協議:
使用TCP協議前,須先建立TCP連接,形成傳輸數據通道
傳輸前,採用“三次握手”方式,是可靠的
TCP協議進行通信的兩個應用進程:客戶端、服務端
在連接中可進行大數據量的傳輸
傳輸完畢,需釋放已建立的連接,效率低
UDP協議:
將數據、源、目的封裝成數據包,不需要建立連接
每個數據報的大小限制在64K內
因無需連接,故是不可靠的
發送數據結束時無需釋放資源,速度快
TCP的編程:Socket ServerSocket
例子:
1.客戶端發送內容給服務端,服務端將內容打印到控制檯上。
2.客戶端發送內容給服務端,服務端給予反饋。
3.客戶端發送內容給服務端,服務端保存到本地,並返回“發送成功”給客戶端,並關閉相應的連接。
UDP的編程:DatagramSocket DatagramPacket
URL的編程:統一資源定位符 一個URL的對象,對應着互聯網上的一個資源
我們可通過URL的對象調用其相應的方法,將此資源讀取(“下載”)