標籤:
物件導向的底層實現
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請求的對象。
android學習筆記----JNI中的c控制java