Coins Java - Experiment17

自前クラス/メソッドをリフレクションAPIから呼び出す

[Coins Java - Experiment]

目的

作業

前回のソースを引き継ぐ

前回作成したHelloクラスのmainメソッドをReflection APIで呼び出すクラスを作成する。

$ emacs Start.java
--- Start.java
import java.lang.reflect.Method;

public class Start {
    public static void main(String[] args) throws Exception {
        Class klass = Class.forName("Hello");
        Method method = klass.getMethod("main", new Class[]{args.getClass()});
        method.invoke(null, new Object[]{args});
    }
}
---
$ gcj -c Start.java

前回作成したmain.cに以下の変更を加える。

$ emacs main.c
--- main.c
#include "types/class.h"

void _Jv_RegisterClasses(cj_class **);
void JvRunMain(cj_class *, int, const char **);

extern const char **_Jv_Compiler_Properties;
extern cj_class Hello_class;
extern cj_class _ZN5Start6class$E;

static const char *empty[] = { 0 };

static cj_class *my_jcr_list[] = {
  &Hello_class,
  0
};

int main (int argc, const char **argv) {
  _Jv_Compiler_Properties = empty;
  _Jv_RegisterClasses(&my_jcr_list[0]);
  JvRunMain (&_ZN5Start6class$E, argc, argv);

  return 0;
}
---

コンパイル

$ gcc -lgcj -Wall Start.o hello.c main.c

結果

以下のようになった。

$ ./a.out
Hello, world!

正しく呼び出せていることが確認できる。

考察

_Jv_RegisterClasses(&my_jcr_list[0]);をコメントアウトすると、実行時に以下のようなエラーが起こる。

Exception in thread "main" java.lang.ClassNotFoundException: Hello not found in
      [file:./, file:/usr/local/java/j2sdk/lib/tools.jar, file:/usr/local/java/j2sdk/lib/dt.jar, file:./, core:/]
   at java.net.URLClassLoader.findClass(java.lang.String) (/usr/lib/libgcj.so.4.0.0)
   at gnu.gcj.runtime.VMClassLoader.findClass(java.lang.String) (/usr/lib/libgcj.so.4.0.0)
   at java.lang.ClassLoader.loadClass(java.lang.String, boolean) (/usr/lib/libgcj.so.4.0.0)
   at _Jv_FindClass(_Jv_Utf8Const, java.lang.ClassLoader) (/usr/lib/libgcj.so.4.0.0)
   at java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (/usr/lib/libgcj.so.4.0.0)
   at java.lang.Class.forName(java.lang.String) (/usr/lib/libgcj.so.4.0.0)
   at Start.main(java.lang.String[]) (/home/java/coins/ex17/Start.java:5)

自前で登録するか、もしくは .jcr セクションに配置して自動的に登録してもらう必要がありそうだ。

Copyright (C) 2002-2006 s.arakawa