当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

传送和操纵Java对象[Java编程]

赞助商链接



  本文“传送和操纵Java对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在前例中,我们将一个字串传送给固有办法.事实上,亦可将自己成立的Java对象传送给固有办法.
在我们的固有办法内部,可拜候已收到的那些对象的字段及办法.
为传送对象,声明固有办法时要采取原始的Java语法.以下例所示,MyJavaClass有一个public(大众)字段,以及一个public办法.UseObjects类声明了一个固有办法,用于接纳MyJavaClass类的一个对象.为调查固有办法能否能掌握自己的自变量,我们设置了自变量的public字段,调用固有办法,然后打印出public字段的值.
class MyJavaClass {
  public void divByTwo() { aValue /= 2; }
  public int aValue;
}

public class UseObjects {
  public static void main(String [] args) {
    UseObjects app = new UseObjects();
    MyJavaClass anObj = new MyJavaClass();
    anObj.aValue = 2;
    app.changeObject(anObj);
    System.out.println("Java: " + anObj.aValue);
  }
  private native void 
  changeObject(MyJavaClass obj);
  static {
    System.loadLibrary("UseObjImpl");
  }
}

编译好代码,并将.class文件传送给javah后,便可以实现固有办法.在下面这个例子中,一旦获得字段和办法ID,就会通过JNI函数拜候它们.
JNIEXPORT void JNICALL
Java_UseObjects_changeObject(
  JNIEnv * env, jobject jThis, jobject obj) {
  jclass cls;
  jfieldID fid;
  jmethodID mid;
  int value;
  cls = env->GetObjectClass(obj);
  fid = env->GetFieldID(cls,
        "aValue", "I");
  mid = env->GetMethodID(cls,
        "divByTwo", "()V");
  value = env->GetIntField(obj, fid);
  printf("Native: %d\n", value);
  env->SetIntField(obj, fid, 6);
  env->CallVoidMethod(obj, mid);
  value = env->GetIntField(obj, fid);
  printf("Native: %d\n", value);
}
除第一个自变量外,C++函数会接纳一个jobject,它代表Java对象引用“固有”的那一面——那个引用是我们从Java代码里传送的.我们简单地读取aValue,把它打印出来,改变这个值,调用对象的divByTwo()办法,再将值重新打印一遍.
为拜候一个字段或办法,首先必须获得它的标识符.操纵得当的JNI函数,可便利地获得类对象、元素名以及签名信息.这些函数会返回一个标识符,操纵它可拜候对应的元素.固然这一方法显得有些崎岖,但我们的固有办法确切对Java对象的内部筹划一无所知.因此,它必须通过由JVM返回的索引拜候字段和办法.这样一来,差别的JVM便可实现差别的内部对象筹划,同时不会对固有办法造成影响.
若运行Java程序,就会发现从Java那一侧传来的对象是由我们的固有办法处理的.但传送的毕竟是什么呢?是指针,还是Java引用?并且垃圾汇集器在固有办法调用期间又在做什么呢?
垃圾汇集器会在固有办法履行期间持续运行,但在一次固有办法调用期间,我们的对象可保证不会被当作“垃圾”汇集去.为确保这一点,事前成立了“部分引用”,并在固有办法调用之后当即排除.由于它们的“生命期”与调用历程息息相关,所以可以保证对象在固有办法调用期间的有效性.
由于这些引用会在每次函数调用的时刻成立和破坏,所以不可在static变量中制作固有办法的部分副本(本地拷贝).若但愿一个引用在函数存在期间持续有效,就需求一个全局引用.全局引用不是由JVM成立的,但通过调用特定的JNI函数,程序员可将部分引用扩大为全局引用.成立一个全局引用时,需对引用对象的“生存时间”负责.全局引用(以及它引用的对象)会一向留在内存里,直到用特定的JNI函数明确释放了这个引用.它近似于C的malloc()和free().
  以上是“传送和操纵Java对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 传送和操纵Java对象
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .