2010-06-15 130 views
6

下面是一個示例代碼如何判斷一個方法是否有使用反射的可變參數?

package org.example; 

import java.lang.reflect.Method; 

class TestRef { 

     public void testA(String ... a) { 
       for (String i : a) { 
         System.out.println(i); 
       } 
     } 

     public static void main(String[] args){ 

       Class testRefClass = TestRef.class; 

       for (Method m: testRefClass.getMethods()) { 
         if (m.getName() == "testA") { 
           System.out.println(m); 
         } 
       } 
     } 
} 

輸出是

public void org.example.TestRef.testA(java.lang.String[]) 

所以方法的簽名被報告給取字符串的數組。

在反射庫中是否有任何意思我可以告訴方法是原來聲明爲可變參數嗎?

回答

18

在反射庫中是否有任何意思我可以告訴該方法最初聲明爲可變參數?

是。 java.lang.reflect.Method.isVarArgs()

但是,只有在您試圖以人類可讀形式組裝和顯示方法簽名時纔可使用。如果您需要使用反射調用varargs方法,則必須將可變參數參數組裝爲數組類型的參數。

+2

還應該注意的是,method.getModifiers()將爲可變參數方法設置Modifier.TRANSIENT位。 – ILMTitan 2010-06-15 14:33:34

+1

@ILMTitan - 我不明白爲什麼值得注意。 「瞬態」修飾符對於一種方法沒有意義。該位僅被設置,因爲相應的類文件標誌位在不同的上下文中用於不同的事情;即TRANSIENT和VARARGS位是相同的位。 – 2012-11-26 01:46:03

1

真的沒有實際的...符號引入很晚在java中加入可變參數的過程差異

static public void main(String[] args) 
static public void main(String... args) 

。詹姆斯高斯林提出這個建議,他認爲這是可靠的。在此之前,相同的[]表示可變參數。

+4

你有一個源代碼嗎?這種差異似乎比美學更深刻。 – Yishai 2010-06-15 02:28:01

相關問題