2010-06-15 5 views
6

여기 샘플 코드리플렉션을 사용하여 메소드에 varargs 인수가 있음을 알리는 방법은 무엇입니까?

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[]) 

이다.

리플렉션 라이브러리에 어떤 의미가 있습니까?이 메서드는 입니다. 원래은 varargs를 사용하도록 선언 되었습니까?

답변

18

반사 라이브러리에 어떤 의미가 있습니까?이 메서드는 원래 varargs를 사용하도록 선언 되었습니까?

넵. java.lang.reflect.Method.isVarArgs().

그러나 사람이 읽을 수있는 형식으로 메서드 서명을 어셈블하고 표시하려는 경우에만 사용됩니다. 리플렉션 (reflection)을 사용하여 varargs 메소드를 호출해야하는 경우 varargs 인수를 배열 유형의 인수로 어셈블해야합니다.

+2

또한 method.getModifiers()에는 varargs 메소드에 대해 Modifier.TRANSIENT 비트가 설정됩니다. – ILMTitan

+1

@ILMTitan - 왜 주목할 가치가 있는지 모르겠다. 'transient' 수식자는 메서드에서 의미가 없습니다. 해당 클래스 파일 플래그 비트가 다른 컨텍스트의 다른 항목에 사용되므로 비트만 설정됩니다. TRANSIENT 및 VARARGS 비트는 동일한 비트이다. –

1

정말 실제로 ... 표기는 자바에서 가변 인자를 추가하는 과정에서 매우 늦게 도입 된 차이

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

없다. 제임스 고슬링은 그것을 제안했다, 그는 더 귀엽다고 생각한다. 그 전에는 같은 []가 vararg를 나타냅니다.

+4

소스가 있습니까? 그 차이는 미학보다 훨씬 심오한 것처럼 보인다. – Yishai

관련 문제