gcj/24


gcj

instanceof

Java を使う上では、はずせない演算子 instanceof ですが、残念ながら libjava で実装しないと使えないことがわかったので実装します。

Class.h を眺める

実装開始

javalang.cpp

以下を追加します。jclass のフィールドは private が多いので、行頭で

#define private public

というおなじないをかけておきます(いい加減でごめんなさい)。

extern "C" jboolean _Jv_IsInstanceOf(jobject obj, jclass cls) {
	char* target = cls->name->data;
	jclass source = obj->getClass();
	if (strcmp(target, source->name->data) == 0) return true;
	while ((source = source->superclass) != NULL) {
		if (strcmp(target, source->name->data) == 0) return true;
	}
	for (int i = 0; i < obj->getClass()->interface_count; i++) {
		source = obj->getClass()->interfaces[i];
		if (strcmp(target, source->name->data) == 0) return true;
	}
	return false;
}

Main.java

instanceof のテスト用コード

import java.util.ArrayList;

interface Test1 {}
interface Test2 {}
interface Test3 {}
interface Test4 {}

public class Main extends ArrayList implements Test1, Test2, Test3 {
	public static void main(String[] args) {
		Main main = new Main();
		if (main instanceof Main) {
			System.out.println("main == Main");
		}
		if (main instanceof ArrayList) {
			System.out.println("main == ArrayList");
		}
		if (main instanceof Object) {
			System.out.println("main == Object");
		}
		if (main instanceof Test1) {
			System.out.println("main == Test1");
		}
		if (main instanceof Test2) {
			System.out.println("main == Test2");
		}
		if (main instanceof Test3) {
			System.out.println("main == Test3");
		}
		if (!(main instanceof Test4)) {
			System.out.println("main != Test4");
		}
	}
}

実行例

ちゃんと Test4 のところだけ false になっています。

gcj.gif

コメント

コメントはありません。 コメント/gcj/24?

お名前:

MENU

now: 2

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3152, today: 1, yesterday: 0

添付ファイル: filejavalang.cpp 940件 [詳細] filegcj.gif 763件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3794d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.065 sec.