???? 學(xué)習(xí)交流群:
??1:這是孫哥suns給大家的福利!
??2:我們免費(fèi)分享Netty、Dubbo、k8s、Mybatis、Spring...應(yīng)用和源碼級(jí)別的視頻資料
????3:QQ群:583783824 ? ???? ?工作微信:BigTreeJava 拉你進(jìn)微信群,免費(fèi)領(lǐng)??!
????4:本文章內(nèi)容出自上述:Spring應(yīng)用課程!????
????5:以上內(nèi)容,進(jìn)群免費(fèi)領(lǐng)取呦~ ????????
文章目錄
一:方法的調(diào)用
1:概述
2:靜態(tài)鏈接
3:動(dòng)態(tài)鏈接
二:方法的綁定
1:綁定概念
2:早期綁定
3:晚期綁定
三:晚期綁定示例
1:編寫(xiě)代碼
2:jclasslib查看內(nèi)容
四:早期綁定示例?
1:編寫(xiě)代碼
2:jclasslib查看內(nèi)容
五:總結(jié)說(shuō)明
一:方法的調(diào)用
? ? ? ? 我們每天都在寫(xiě)方法的調(diào)用,但是我們能搞明白其中的原理和JVM當(dāng)中的操作步驟么?這就是本文的意義。
1:概述
? ? ? ? 官方說(shuō)法:
? ? ? ? 在JVM中,將符號(hào)引用轉(zhuǎn)換為調(diào)用方法的直接引用這個(gè)操作是跟JVM當(dāng)中方法的綁定機(jī)制息息相關(guān)的。
? ? ? ? 說(shuō)人話:
? ? ? ? 上邊這段話是什么意思?我這里給大家解釋一下,我們javap整理完畢字節(jié)碼文件之后,我們會(huì)可以在任意一個(gè)方法中查看code下的字節(jié)碼指令,很多字節(jié)碼指令的后邊都會(huì)跟#數(shù)字這么一個(gè)概念,這個(gè)就是符號(hào)引用,這個(gè)引用指向常量池。
? ? ? ? 所謂將符號(hào)引用轉(zhuǎn)換為方法的直接引用,就是將這個(gè)字節(jié)碼指令后邊的符號(hào)引用,轉(zhuǎn)變?yōu)檎鎸?shí)的方法。
? ? ? ? 下列中的#3就是符號(hào)引用。
public void methodB();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #6 // String methodB().....
5: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: aload_0
9: invokevirtual #7 // Method methodA:()V
12: aload_0
13: dup
14: getfield #2 // Field num:I
17: iconst_1
18: iadd
19: putfield #2 // Field num:I
22: return
? ? ? ? 從上述找一個(gè)例子的話,就是將偏移地址為9的字節(jié)碼指令后邊的#7這個(gè)符號(hào)引用用真實(shí)的方法字面量代替
2:靜態(tài)鏈接
? ? ? ? 官方說(shuō)法:
????????當(dāng)一個(gè)字節(jié)碼文件被裝載進(jìn)JVM內(nèi)部時(shí),如果被調(diào)用的目標(biāo)方法在編譯期可知且運(yùn)行期保持不變時(shí)。這種情況下將調(diào)用方法的符號(hào)引用轉(zhuǎn)換為直接引用的過(guò)程稱之為靜態(tài)鏈接。
? ? ? ? 說(shuō)人話:
? ? ? ? 靜態(tài)鏈接:這種方式在編譯階段就已經(jīng)把符號(hào)引用直接轉(zhuǎn)換為了直接引用。
3:動(dòng)態(tài)鏈接
? ? ? ? 官方說(shuō)法:
????????如果被調(diào)用的方法在編譯期無(wú)法被確定下來(lái),也就是說(shuō),只能夠在程序運(yùn)行期將調(diào)用方法的符號(hào)引用轉(zhuǎn)換為直接引用,由于這種引用轉(zhuǎn)換過(guò)程具備動(dòng)態(tài)性,因此也就被稱之為動(dòng)態(tài)鏈接。
? ? ? ? 說(shuō)人話:
? ? ? ? 動(dòng)態(tài)鏈接:這種方式在運(yùn)行階段才能把符號(hào)引用直接轉(zhuǎn)換為直接引用。
二:方法的綁定
1:綁定概念
????????綁定是一個(gè)字段、方法或者類在符號(hào)引用被替換為直接引用的過(guò)程,這僅僅發(fā)生一次。這個(gè)不論是編譯器確定還是運(yùn)行期確定都只會(huì)發(fā)生一次,不會(huì)修改。
????????對(duì)應(yīng)的方法的綁定機(jī)制為:早期綁定 (Early Bindng)和晚期綁定(Late Binding)。
2:早期綁定
? ? ? ? 官方說(shuō)法:
????????早期綁定就是指被調(diào)用的目標(biāo)方法如果在編譯期可知,且運(yùn)行期保持不變時(shí)即可將這個(gè)方法與所屬的類型進(jìn)行綁定,這樣一來(lái),由于明確了被調(diào)用的目標(biāo)方法究竟是哪一個(gè),因此也就可以使用靜態(tài)鏈接的方式將符號(hào)引用轉(zhuǎn)換為直接引用。
? ? ? ? 說(shuō)人話:
? ? ? ? 早期綁定是和我們的靜態(tài)綁定相對(duì)應(yīng)的。
3:晚期綁定
? ? ? ? 官方說(shuō)法:
????????如果被調(diào)用的方法在編譯期無(wú)法被確定下來(lái),只能夠在程序運(yùn)行期根據(jù)實(shí)際的類型綁定相關(guān)的方法,這種綁定方式也就被稱之為晚期綁定
? ? ? ? 說(shuō)人話:
? ? ? ? 晚期綁定是和我們的動(dòng)態(tài)綁定相對(duì)應(yīng)的。
三:晚期綁定示例
1:編寫(xiě)代碼
class Animal {
public void eat(){
System.out.println("動(dòng)物進(jìn)食");
}
}
interface Huntable{
void hunt();
}
class Dog extends Animal implements Huntable{
@Override
public void eat(){
System.out.println("狗吃骨頭");
}
@Override
public void hunt() {
System.out.println("捕食耗子,多管閑事");
}
}
class Cat extends Animal implements Huntable{
@Override
public void eat(){
System.out.println("貓吃魚(yú)");
}
@Override
public void hunt() {
System.out.println("捕食耗子,天經(jīng)地義");
}
}
public class AnimalTest{
public void showAnimal(Animal animal){
animal.eat();//晚期綁定
}
public void showHunt(Huntable h){
h.hunt();//晚期綁定
}
}
2:jclasslib查看內(nèi)容
四:早期綁定示例?
1:編寫(xiě)代碼
class Animal {
public void eat(){
System.out.println("動(dòng)物進(jìn)食");
}
}
interface Huntable{
void hunt();
}
class Dog extends Animal implements Huntable{
@Override
public void eat(){
super.eat();//早期綁定
System.out.println("狗吃骨頭");
}
@Override
public void hunt() {
System.out.println("捕食耗子,多管閑事");
}
}
class Cat extends Animal implements Huntable{
public Cat(){
super();//早期綁定
}
public Cat(String name){
this();//早期綁定
}
@Override
public void eat(){
System.out.println("貓吃魚(yú)");
}
@Override
public void hunt() {
System.out.println("捕食耗子,天經(jīng)地義");
}
}
public class AnimalTest{
public void showAnimal(Animal animal){
animal.eat();//晚期綁定
}
public void showHunt(Huntable h){
h.hunt();//晚期綁定
}
}
2:jclasslib查看內(nèi)容
? ? ? ? 光標(biāo)放到cat這個(gè)類上查看他的jclasslib
?????????invokeSpecial是早期綁定字節(jié)碼指令,invokevirtual是晚期綁定的字節(jié)碼指令。
五:總結(jié)說(shuō)明
????????隨著高級(jí)語(yǔ)言的橫空出世,類似于Java一樣的基于面向?qū)ο蟮木幊陶Z(yǔ)言如今越來(lái)越多,盡管這類編程語(yǔ)言在語(yǔ)法風(fēng)格上存在一定的差別,但是它們彼此之間始終保持著一個(gè)共性,那就是都支持封裝、繼承和多態(tài)等面向?qū)ο筇匦?/p>
????????既然這一類的編程語(yǔ)言具備多態(tài)特性,那么自然也就具備早期綁定和晚期綁定兩種綁定方式。
????????Java中任何一個(gè)普通的方法其實(shí)都具備虛函數(shù)的特征,也就是運(yùn)行期才能確定下來(lái),它們相當(dāng)于c++語(yǔ)言中的虛函數(shù) (c++中則需要使用關(guān)鍵字virtual來(lái)顯式定義)。
????????如果在Java程序中不希望某個(gè)方法擁有虛函數(shù)的特征時(shí),則可以使用關(guān)鍵字final來(lái)標(biāo)記這個(gè)方法。也就是一個(gè)方法不想被晚期綁定,直接把他給final修飾即可。
文章目錄
寫(xiě)給自己的話
一:協(xié)議分層與OSI參考模型
二:通過(guò)對(duì)話理解分層
三:OSI參考模型
寫(xiě)給自己的話
????????不從惡人的計(jì)謀,不站罪人的道路,不坐褻慢人的座位,惟喜愛(ài)耶和華的律法,晝夜思想,這人便為有福!他要像一棵樹(shù)栽在溪水旁,按時(shí)候結(jié)果子,葉子也不枯干。凡他所做的盡都順利。
一:協(xié)議分層與OSI參考模型
????????ISO在制定標(biāo)準(zhǔn)化OSI之前,對(duì)網(wǎng)絡(luò)體系結(jié)構(gòu)相關(guān)的問(wèn)題進(jìn)行了充分的討論最終提出了作為通信協(xié)議設(shè)計(jì)指標(biāo)的 OSI參考模型。這一模型將通信協(xié)議中必要的功能分成了7層。通過(guò)這些分層,使得那些比較復(fù)雜的網(wǎng)絡(luò)協(xié)議更加簡(jiǎn)單化。
????????在這一模型中,每個(gè)分層都接收由它下一層所提供的特定服務(wù),并且負(fù)責(zé)為自己的上一層提供特定的服務(wù)。上下層之間進(jìn)行交互時(shí)所遵循的約定叫做“接口”。同一層之間的交互所遵循的約定叫做“協(xié)議”協(xié)議分層就如同計(jì)算機(jī)軟件中的模塊化開(kāi)發(fā)。
????????OSI 參考模型的建議是比較理想化的。它希望實(shí)現(xiàn)從第一層到第七層的所有模塊,并將它們組合起來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通信。分層可以將每個(gè)分層獨(dú)立使用,即使系統(tǒng)中某些分層發(fā)生變化,也不會(huì)波及整個(gè)系統(tǒng)。因此,可以構(gòu)造一個(gè)擴(kuò)展性和靈活性都較強(qiáng)的系統(tǒng)。此外,通過(guò)分層能夠細(xì)分通信功能,更易于單獨(dú)實(shí)現(xiàn)每個(gè)分層的協(xié)議,并界定各個(gè)分層的具體責(zé)任和義務(wù)。這些都屬于分層的優(yōu)點(diǎn)。
????????而分層的劣勢(shì),可能就在于過(guò)分模塊化、使處理變得更加沉重以及每個(gè)模塊都不得不實(shí)現(xiàn)相們的外理邏輯問(wèn)題
二:通過(guò)對(duì)話理解分層
????????關(guān)于協(xié)議的分層,我們?cè)僖?A 與C對(duì)話為簡(jiǎn)單說(shuō)明一下。在此,我們只考慮語(yǔ)言層和通信設(shè)備層這兩個(gè)分層的情況
????????首先,以電話聊天為例,圖1.17 上部分中的 A 與C 兩個(gè)人正在通過(guò)電話(通信設(shè)備) 用漢語(yǔ) (語(yǔ)言協(xié)議) 聊天。我們?cè)敿?xì)分析一下這張圖。
????????表面上看 A 跟C是在用漢語(yǔ)直接對(duì)話,但實(shí)際上 A與C都是在通過(guò)電話機(jī)的聽(tīng)筒聽(tīng)取聲音,都在對(duì)著麥克風(fēng)說(shuō)話。想象一下如果有一個(gè)素未見(jiàn)過(guò)電話機(jī)的人見(jiàn)到這個(gè)場(chǎng)景會(huì)怎么想?恐怕他一定會(huì)以為 A 和C在跟電話機(jī)聊天吧。
????????其實(shí)在這個(gè)圖中,他們所用的語(yǔ)言協(xié)議作為麥克風(fēng)的音頻輸入,在通信設(shè)備層被轉(zhuǎn)換為電波信號(hào)傳送出去了。傳送到對(duì)方的電話機(jī)后,又被通信設(shè)備層轉(zhuǎn)換為音頻輸出,傳遞給了對(duì)方。因此,A與C其實(shí)是利用電話機(jī)之間通過(guò)音頻轉(zhuǎn)化聲音的接口實(shí)現(xiàn)了對(duì)話
????????通常人們會(huì)覺(jué)得拿起電話與人通話,其實(shí)就好像是直接在跟對(duì)方對(duì)話,然而如果仔細(xì)分析,在整個(gè)過(guò)程中實(shí)際上是電話機(jī)在做中介,人們口中說(shuō)出的漢語(yǔ)是一層協(xié)議,漢語(yǔ)到達(dá)電話機(jī)之后經(jīng)過(guò)電話機(jī)協(xié)議進(jìn)行轉(zhuǎn)換這是電話層的協(xié)議。
????????那么如果我們假定語(yǔ)言層相同而改變了通信設(shè)備層,情況會(huì)如何? 例如,將電話機(jī)改為無(wú)線電。通信設(shè)備層如果改用無(wú)線電,雙方依舊可以痛快的通話,整體的內(nèi)容通信并沒(méi)有因?yàn)橐粚訁f(xié)議修改而變得不可用
? ? ? ? ?那么,如果通信設(shè)備層使用電話機(jī),而語(yǔ)言層改為英語(yǔ)的話情況又會(huì)如何?很顯然,電話機(jī)本身不會(huì)受限于使用者使用的語(yǔ)言。因此,這種情況與使用漢語(yǔ)通話時(shí)完全一樣,依然可以實(shí)現(xiàn)通話(上圖下部分)。
三:OSI參考模型
????????OSI 參考模型將協(xié)議整理并分為了易于理解的7個(gè)分層:
????????OSI參考模型終究是一個(gè)“模型”,它也只是對(duì)各層的作用做了一系列粗略的界定,并沒(méi)有對(duì)協(xié)議和接口進(jìn)行詳細(xì)的定義。若想要了解協(xié)議的更多細(xì)節(jié),還是有必要參考每個(gè)協(xié)議本身的具體規(guī)范。
????????許多通信協(xié)議,都對(duì)應(yīng)了 OSI 參考模型7個(gè)分層中的某層。通過(guò)這一點(diǎn),可以大致了解該協(xié)議在整個(gè)通信功能中的位置和作用。
1:應(yīng)用層
????????為應(yīng)用程序提供服務(wù)并規(guī)定應(yīng)用程序中通信相關(guān)的細(xì)節(jié)。包括文件傳輸、電子郵件、遠(yuǎn)程登錄等協(xié)議。?
2:表示層
????????將應(yīng)用處理的信息轉(zhuǎn)換為適合網(wǎng)絡(luò)傳輸?shù)母袷剑驅(qū)?lái)自下一層的數(shù)據(jù)轉(zhuǎn)換為上層能夠處理的格式。因此它主要負(fù)責(zé)數(shù)據(jù)格式的轉(zhuǎn)換。具體來(lái)說(shuō),就是將設(shè)備固有的數(shù)據(jù)格式轉(zhuǎn)換為網(wǎng)絡(luò)標(biāo)準(zhǔn)傳輸格式。不同設(shè)備對(duì)同一比特流解釋的結(jié)果可能會(huì)不同。因此,使它們保持一致是這一層的主要作用。
3:會(huì)話層
????????負(fù)責(zé)建立和斷開(kāi)通信連接 (數(shù)據(jù)流動(dòng)的邏通路),以及數(shù)據(jù)的分等數(shù)據(jù)傳輸相關(guān)的管理。
4:傳輸層
????????起著可靠傳輸?shù)淖饔谩V辉谕ㄐ烹p方節(jié)點(diǎn)上進(jìn)行處理,而無(wú)需在路由器上處理。
5:網(wǎng)絡(luò)層
????????將數(shù)據(jù)傳輸?shù)侥繕?biāo)地址。目標(biāo)地址可以是多個(gè)網(wǎng)絡(luò)通過(guò)路由器連接而成的某一個(gè)地址。因此這一層主要負(fù)責(zé)尋址和路由選擇。
6:數(shù)據(jù)鏈路層
????????負(fù)責(zé)物理層面上互連的、節(jié)點(diǎn)之間的通信傳輸。例如與1個(gè)以太網(wǎng)相連的2個(gè)節(jié)點(diǎn)之間的通信。將01序列劃分為具有意義的數(shù)據(jù)幀傳送個(gè)對(duì)方(數(shù)據(jù)幀的生成與接收)
7:物理層文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-696884.html
????????負(fù)責(zé)01比特流與電壓高低或者是光閃滅之間的轉(zhuǎn)換文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-696884.html
到了這里,關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)之TCP/IP協(xié)議第二篇:OSI參考模型詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!