編輯:關於android開發
面向對象的底層實現
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應用開發Scroller詳解及源碼淺析 1 背景 大家都知道Android View提供了scrollTo()與scrollBy()方法來供我們進行Vie
Xamarin.Android 入門之:xamarin使用webserver和html交互,xamarin一、引言 如今,Android+html5開發已經成為最流行的開
QQ空間實現(一)—— 展示說說中的評論內容並有相應點擊事件,評論內容事件大家都玩QQ空間客戶端,對於每一個說說,我們都可以評論,那麼,對於某一條評論: 白雪公主 回復
硅谷社交6--添加聯系人--發送添加好友邀請,硅谷6-- 1.查找按鈕的處理 // 去服務器判斷當前查找的用戶是否存在 userInfo = new UserInfo(