リフレクションで NdefRecord を使用して NdefMessage をインスタンス化したいと考えています。実際に動作する必要があるが動作しない単純なコードスニペットの下:
// getting Ndef Message Class OK
Class<?> ndefMessageClass = Class.forName("android.nfc.NdefMessage");
//getting NdefRecord class OK
Class<?> ndefRecordClass = Class.forName("android.nfc.NdefRecord");
//getting ArrayOf NdefRecord
Object[] ndefRecords = (Object[])Array.newInstance(ndefRecordClass, 1)
//filling the new Array
//I'm shure I get an Correct NdefRecord, but dont wanna mess the Code here
ndefRecords[0] = getNdefRecord()
//getting the constructor OK
Constructor<?> const = ndefMessageClass.getConstructor(ndefRecords.class)
//initialization fails here
Object myNdefMessage = const.newInstance(ndefRecords)
//same with this
Object ndefMessage = const.newInstance(Arrays.asList(args).toArray());
これがどのように失敗するかを絶対に考えることはできず、次のエラーメッセージが表示されます。
04-16 15:38:42.113: W/System.err(13360): java.lang.IllegalArgumentException: 引数 1 の型は android.nfc.NdefRecord[] である必要があり、android.nfc.NdefRecord を取得しました
したがって、コンストラクターが正しく認識されます。このように取得しようとすると:
Constructor<?> const = ndefMessageClass.getConstructor(ndefRecords[0].getClass())
私は得る
04-16 15:44:59.621: W/System.err(14033): java.lang.NoSuchMethodException: [クラス android.nfc.NdefRecord]
デバッグ中に、すべてが正しいことがわかります。配列のインデックスにアクセスできます。なぜJavaは、ndefRecordsはNdefRecords []ではなくNdefRecordsクラスであると私に言いますか??