0

リフレクションで 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クラスであると私に言いますか??

4

1 に答える 1

2

あなたの問題は、newInstance メソッドがダイヤモンド関数(つまり、可変数のパラメーターを取る関数)であることです:

public T newInstance(Object... initargs)

ただし、Java では、そのような関数に配列を渡すことができます。配列の要素は、関数に渡される連続したパラメーターと見なされます。したがって、次のようになります。

public static void main (String [] args)
{
   double [] a = {1.1, 2.2, 4.4};
   System.out.println(avg(a) == avg(1.1, 2.2, 4.4));
}
static double avg (double ... numbers)
{
   double total = 0;
   for (int i = 0; i < numbers.length; i++)
        total += numbers [i];
   return total / numbers.length;
}

そして、avg関数への 2 つの呼び出しはまったく同じ意味を持ちます。

私が考えることができるあなたのための1つの簡単な修正は、あなたの呼び出しを次のように変更することですnewInstance:

Object myNdefMessage = const.newInstance(new Object[] {ndefRecords});
于 2012-04-16T14:05:56.050 に答える