面向對象的底層實現 java作為面向對象高級語言,可對現實世界進行建模。和麵向過程不同的是面向對象軟體的編寫不是流程的堆積,而是對業務邏輯的多視角分解和分類。其過程大致為: 1)、將知識分解成不同粒度的小概念。 2)、對概念進行分類,形成類、模塊、系統 3)、用電腦語言將其實現為對象(包含操作和數 ...
面向對象的底層實現
java作為面向對象高級語言,可對現實世界進行建模。和麵向過程不同的是面向對象軟體的編寫不是流程的堆積,而是對業務邏輯的多視角分解和分類。其過程大致為:
1)、將知識分解成不同粒度的小概念。
2)、對概念進行分類,形成類、模塊、系統
3)、用電腦語言將其實現為對象(包含操作和數據)
然而,大多程式員編寫代碼時很少思考面向對象的體系是如何實現的。因為它屬於底層,並不必要。但是,學習過Java反射技術並有所思考的人會意識到,面向對象的種種語法本身也是有意思的系統。例如,屬性本身是Field類的對象,方法是Method類的對象,甚至類也是Class類對象。
JNI學習總結
JNI是android中java與c的交互協議,它規定了java代碼與c代碼之間的相互調用、變數存取、新建對象等操作。java是面向對象語言,而c是面向過程語言。兩者在語法和解決問題的思維方式上有所區別,那麼如何解決其中的衝突呢?
答案就是,深入到面向對象體系底層去,以屬性、方法、類為單位進行操作。java的類跑在VM中,每一個對象、每一個方法、每一個屬性、每一個類都由虛擬機進行管理,然後映射為底層二進位數據儲存在記憶體中。因此,如果有一個VM的介面暴露給程式員,可以想象會發生什麼事。我們可以不用new就新建對象,不用點調用函數,不用賦值號給屬性賦值。我們可以通過請求VM,直接對屬性、方法、類進行操作,這裡與Java的反射機制有類似的地方。不一樣的是,JNI中c調用java是用c語法而非java語法,c中直接通過關聯到VM的指針做各種VM級的操作。
總而言之,c調用java的整體思路就是通過VM對類、方法、屬性和對象的管理實現面向對象動作的分解。
c中從當前對象thiz中獲取類:
jclass clazz = (*env)->GetObjectClass(env,thiz);
從類中獲取某函數ID:
jmethodID m_mid = (*env)->GetMethodID(env,clazz,"setV","(I)V");
使用對象和函數ID調用java對象里的對象函數(類函數使用類ID):
(*env)->CallVoidMethod(env,thiz,m_mid,data);
從類中獲取屬性ID:
jFiledID m_fid = (*env)->GetFiledID(env,clazz,"data","I");
使用對象和屬性ID取java對象里的值:
int n = (int)(*env)->GetObjectFiled(env,thiz,m_fid);
獲取某個類:
jclass rvclass = (*env)->FindClass(env,"com/misoo/counter/ResultValue");
類中獲取構造函數ID:
jmethodID constr = (*env)->GetMethodID(env,rvclass,"<init>","()V");
新建對象:
jobject ref = (*env)->NewObject(env,rvclass,constr);
*以上env是指針變數,指向一個可以處理VM請求的對象。