android对NdefMessage构建的反思失败了

时间:2012-04-16 13:48:56

标签: java android arrays reflection

我想使用带有Reflection的NdefRecord来实例化NdefMessage。下面是一个真正应该的简单codeSnippet,但不是:

// 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());

我绝对不会想到这会如何失败,得到以下ErrorMessage:

  

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:[class android.nfc.NdefRecord]

在调试时,它向我显示每一个都是正确的。我可以访问我的Array的索引。为什么地狱java告诉我ndefRecords是NdefRecords类而不是NdefRecords [] ??

1 个答案:

答案 0 :(得分:2)

你的问题是newInstance method是钻石函数(即带有可变数量参数的函数):

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函数的两次调用具有完全相同的含义。

我能想到的一个快速解决方法是将您的电话号码更改为newInstance

Object myNdefMessage = const.newInstance(new Object[] {ndefRecords});