java语言 百分网手机站

java中什么是字段

时间:2020-10-04 14:19:53 java语言 我要投稿

java中什么是字段

  我们把表中的每一行叫做一个“记录”,每一个记录包含这行中的所有信息,就像在通讯录数据库中某个人全部的信息,但记录在数据库中并没有专门的记录名,常常用它所在的行数表示这是第几个记录。在数据库中存放在表行列交叉处的数据叫做“值”,它是数据库中最基本的存储单元,它的位置要由这个表中的记录和字段来定义。

  JAVA支持两种field(字段),每一个对象的实例都有一个对象字段的复制;所有的对象共享一个类的静态字段。本地方法使用JNI提供的函数可以获取和修改这两种字段。先看一个从本地代码中访问对象字段的例子:

  class InstanceFieldAccess {

  private String s;

  private native void accessField();

  public static void main(String args[]) {

  InstanceFieldAccess c = new InstanceFieldAccess();

  c.s = "abc";

  c.accessField();

  System.out.println("In Java:");

  System.out.println(" c.s = "" + c.s + """);

  }

  static {

  System.loadLibrary("InstanceFieldAccess");

  }

  }

  InstanceFieldAccess这个类定义了一个对象字段s。main方法创建了一个对象并设置s的值,然后调用本地方法InstanceFieldAccess.accessField在本地代码中打印s的值,并把它修改为一个新值。本地方法返回后,JAVA中把这个值再打印一次,可以看出来,字段s的值已经被改变了。下面是本地方法的.实现:

  JNIEXPORT void JNICALL

  Java_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj)

  {

  jfieldID fid; /* store the field ID */

  jstring jstr;

  const char *str;

  /* Get a reference to obj's class */

  jclass cls = (*env)->GetObjectClass(env, obj);

  printf("In C: ");

  /* Look for the instance field s in cls */

  fid = (*env)->GetFieldID(env, cls, "s",

  "Ljava/lang/String;");

  if (fid == NULL) {

  return; /* failed to find the field */

  }

  /* Read the instance field s */

  jstr = (*env)->GetObjectField(env, obj, fid);

  str = (*env)->GetStringUTFChars(env, jstr, NULL);

  if (str == NULL) {

  return; /* out of memory */

  }

  printf(" c.s = "%s" ", str);

  (*env)->ReleaseStringUTFChars(env, jstr, str);

  /* Create a new string and overwrite the instance field */

  jstr = (*env)->NewStringUTF(env, "123");

  if (jstr == NULL) {

  return; /* out of memory */

  }

  (*env)->SetObjectField(env, obj, fid, jstr);

  }

  运行程序,得到输出为:

  In C:

  c.s = "abc"

  In Java:

  c.s = "123"

  4.1.1 访问一个对象字段的流程

  为了访问一个对象的实例字段,本地方法需要做两步:

  首先,通过在类引用上调用GetFieldID获取field ID(字段ID)、字段名字和字段描述符:

  Fid=(*env)->GetFieldID(env,cls,”s”,”Ljava/lang/String;”);

  上例中的代码通过在对象引用obj上调用GetObjectClass获取到类引用。一旦获取到字段ID,你就可以把对象和字段ID作为参数来访问字段:

  Jstr=(*env)->GetObjectField(env,obj,fid);

  因为字符串和数组是特殊的对象,所以我们使用GetObjectField来访问字符串类型的实例字段。除了Get/SetObjectField,JNI还支持其它如GetIntField、SetFloatField等用来访问基本类型字段的函数。

  4.1.2 字段描述符

  在上一节我们使用过一个特殊的C字符串“Ljava/lang/String”来代表一个JVM中的字段类型。这个字符串被称为JNI field descriptor(字段描述符)。

  字符串的内容由字段被声明的类型决定。例如,使用“I”来表示一个int类型的字段,“F”来表示一个float类型的字段,“D”来表示一个double类型的字段,“Z”来表示一个boolean类型的字段等等。

  像java.lang.String这样的引用类型的描述符都是以L开头,后面跟着一个JNI类描述符,以分号结尾。一个JAVA类的全名中的包名分隔符“.”被转化成“/”。因此,对于一个字段类型的字段来说,它的描述符是“Ljava/lang/String”。

  数组的描述符中包含“]”字符,后面会跟着数组类型的描述符,如“[I”是int[]类型的字段的描述符。12.3.3详细介绍了各种类型的字段描述以及他们代表的JAVA类型。

  你可以使用javap工具来生成字段描述符。

  4.1.3 访问静态字段

  访问静态字段和访问实例字段相似,看下面这个InstanceFieldAccess例子的变形:

  class StaticFielcdAccess {

  private static int si;

  private native void accessField();

  public static void main(String args[]) {

  StaticFieldAccess c = new StaticFieldAccess();

  StaticFieldAccess.si = 100;

  c.accessField();

  System.out.println("In Java:");

  System.out.println(" StaticFieldAccess.si = " + si);

  }

  static {

  System.loadLibrary("StaticFieldAccess");

  }

  }

  StaticFieldAccess这个类包含一个静态字段si,main方法创建了一个对象,初始化静态字段,然后调用本地方法StaticFieldAccess.accessField在本地代码中打印静态字段中的值,然后设置新的值,为了演示这个值确实被改变了,在本地方法返回后,JAVA中再次这个静态字段的值。

  下面是本地方法StaticFieldAccess.accessField的实现:

  JNIEXPORT void JNICALL

  Java_StaticFieldAccess_accessField(JNIEnv *env, jobject obj)

  {

  jfieldID fid; /* store the field ID */

  jint si;

  /* Get a reference to obj's class */

  jclass cls = (*env)->GetObjectClass(env, obj);

  printf("In C: ");

  /* Look for the static field si in cls */

  fid = (*env)->GetStaticFieldID(env, cls, "si", "I");

  if (fid == NULL) {

  return; /* field not found */

  }

  /* Access the static field si */

  si = (*env)->GetStaticIntField(env, cls, fid);

  printf(" StaticFieldAccess.si = %d ", si);

  (*env)->SetStaticIntField(env, cls, fid, 200);

  }

  运行程序可得到输出结果:

  In C:

  StaticFieldAccess.si = 100

  In Java:

  StaticFieldAccess.si = 200


【java中什么是字段】相关文章:

什么是Java12-03

什么是java主线程12-07

什么是java线程池框架12-07

Java工程师是做什么的12-04

java中全排列是如何生成算法11-28

java中反射机制11-16

编程java继承是什么12-06

学Java能做什么12-03

Java开发可以做什么12-08