C指针在JNI中的封装
当jni要封装C的指针时因为java的自动回收机制,与本地的C的指针回收可能不能达到程序员想要达到的结果。因为在C中,开发人员通常会以流程的方式来管理指针,释放内容。并且大我的C功能库也都封装了释放指针指向内存,以及对象释放流程。
在这种情况下,我们需要使用java的transient关键字来持久化对象。并在java中按C功能库的流程来释放本地内存。
transient
transient声明一个实例变量,当对象存储时,它的值不需要维持
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
final
许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的。有时数据的恒定不变是很有用的,例如:
1,一个编译时恒定不变的常量
2,一个在运行时初始化,而你不希望它被改变。
对于编译期常量的这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译期就执行计算式,这减轻了一些运行时的负担。在java中,这类常量必须是基本类型,并且以final表示。在对这个常量定义时,必须进行赋值。
一个即是static又是fianl的域只占一段不能改变的存储空间。
当final应用于对象引用时,而不是基本类型时,其含义有些让人疑惑。对基本类型使用fianl不能改变的是他的数值。而对于对象引用,不能改变的是他的引用,而对象本身是可以修改的。一旦一个final引用被初始化指向一个对象,这个引用将不能在指向其他对象。java并未提供对任何对象恒定不变的支持。这一限制也通用适用于数组,它也是对象。