首页 技术 正文
技术 2022年11月11日
0 收藏 381 点赞 5,126 浏览 1318 个字

面向对象的底层实现

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请求的对象。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289