Coins Java - Experiment13

instanceofとcheckcast

[Coins Java - Experiment]

目的

作業

CNIを呼び出すためのクラスを作る

$ emacs Start.java
--- Start.java
public class Start {

    public static void main(String[] args) {
        nativeMethod();
    }

    public static native void nativeMethod();
}
---
$ gcj -C Start.java
$ gcjh Start

以下の2つの関数を利用して、instanceofとcheckcastの動作を確認する。

$ emacs natStart.cc
--- natStart.cc
#include <stdio.h>

#include <java/lang/Object.h>
#include <java/lang/Class.h>
#include <java/util/List.h>
#include <java/util/ArrayList.h>
#include <java/util/Set.h>
#include <java/lang/ClassCastException.h>
#include "Start.h"

/* extern "C" char *_Jv_IsInstanceOf(void *obj, void *klass); */
extern "C" void *_Jv_CheckCast(void *klass, void *obj);

void Start::nativeMethod (){
  using namespace java::util;

  ::java::lang::Object *alist = new ArrayList();
  ::java::lang::Class *lstclass = &List::class$;
  ::java::lang::Class *setclass = &Set::class$;
  ::java::lang::Class *objclass = &::java::lang::Object::class$;

  printf("alist instanceof List   : %d\n", _Jv_IsInstanceOf(alist, lstclass));
  printf("alist instanceof Set    : %d\n", _Jv_IsInstanceOf(alist, setclass));
  printf("alist instanceof Object : %d\n", _Jv_IsInstanceOf(alist, objclass));

  try {
    printf("check cast alist -> List\n");
    _Jv_CheckCast(lstclass, alist);
    puts("OK.");
  }
  catch (::java::lang::ClassCastException *e) {
    puts("Failure.");
  }

  try {
    printf("check cast alist -> Set\n");
    _Jv_CheckCast(setclass, alist);
    puts("OK.");
  }
  catch (::java::lang::ClassCastException *e) {
    puts("Failure.");
  }

  try {
    printf("check cast alist -> Object\n");
    _Jv_CheckCast(objclass, alist);
    puts("OK.");
  }
  catch (::java::lang::ClassCastException *e) {
    puts("Failure.");
  }
}
---
$ gcc -c natStart.cc

コンパイル

$ gcj --main=Start *.class *.o

結果

以下のようになった。

$ ./a.out
alist instanceof List   : 1
alist instanceof Set    : 0
alist instanceof Object : 1
check cast alist -> List
OK.
check cast alist -> Set
Failure.
check cast alist -> Object
OK.

予想通りの動作をしている。

Copyright (C) 2002-2006 s.arakawa