1、java的編譯和執行原理:
■ 編譯:將原始檔 .java 檔案,通過編譯器(javac 命令) 編譯成 位元組碼檔案 .class 檔案。
■ 執行,通過類載入器(以二進位制流形式)把位元組碼載入進JVM,通過java解析器(java 命令) 進行執行程式。
先將java原始檔進行編譯生成位元組碼檔案,然後通過類載入器ClassLoader
(以二進位制流形式
) 載入進虛擬機器,然後通過java解析器或即使編譯器進行執行。
2、靜態代理和動態代理:
■ 靜態代理:(經歷了編譯
和執行)
在程式執行前就已經存在代理類的位元組碼檔案(因為通過了編譯階段),代理物件和真實物件的關係在執行前就確定了(因為通過了編譯階段)。
■ 動態代理:(只經歷了執行
,我們通過某種手段得到的位元組碼【遵循位元組碼格式和結構】)
動態代理類是在程式執行期間由jvm通過反射等機制動態生成的,所以不存在代理類的位元組碼檔案(因為沒有經歷編譯階段),代理物件和真實物件的關係是在程式執行期間才確定的。
● 如何動態建立一份位元組碼?(實現了在程式碼中動態建立一個類的能力)
通過java的編譯和執行原理,可以看到:在執行時期,是jvm通過位元組碼的二進位制資訊來載入類的。
所以,當我們在執行時期,通過java編譯系統組織.class檔案的格式和結構,生成相應的二進位制資料,然後再把這個二進位制資料載入轉換成對應的類。