<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            java語言

            java中什么是字段

            時間:2025-02-27 15:13:04 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中什么是字段】相關文章:

            Java中的String為什么是不可變的07-10

            什么是Java02-15

            JAVA中throws和throw有什么區別04-28

            Java與Java web有什么不同04-16

            Java是什么07-03

            java中反射機制05-26

            Java中的clone方法08-15

            JAVA中的main函數03-14

            Java中finally的問題05-30

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看