2009-11-18 6 views
1

으로이 방법을 감안할 때 :자바 반사 방법 전화가 제네릭

public final void foo (List<MyClass> bar){ .. } 

나는 반사적으로이 메소드를 호출 할 수 있어야합니다. getMethod 메소드를하기 위해서, 나는 그것을 변경해야 :

public final void foo (List bar){ .. } 

이것은 분명한 이유에 대한 권리를하지 않는 것,하지만 getMethod 메소드의 입력의 어떤 조합 그렇지 않으면 제대로 작동하지 않습니다. 나는 Google에서 아무런 쓸모가없는 높은 곳과 낮은 곳을 검색했습니다. 어떤 충고?

환호 & 감사합니다.

+3

실제 리플렉션 코드를 표시합니다. 그것은 작동해야합니다. – notnoop

+0

반면에 ** T foo (R input) **을 가지고 있다면 지우고 난 후 서명은 반사를 위해 foo (Object)가됩니다; 반환 유형이 서명의 일부가 아니라는 점에 유의하십시오. –

답변

2

나를 위해 작동합니다.

import java.util.ArrayList; 
import java.util.List; 

public class Argh 
{ 
    public void foo(final List<Argh> arghs) 
    { 
     System.out.println("Received " + arghs); 
    } 

    public static void main(final String[] args) throws Exception 
    { 
     Argh.class.getMethod("foo", List.class).invoke(new Argh(), new ArrayList<Argh>()); 
    } 
} 
6
import java.util.*; 
import java.lang.reflect.*; 
public class Test { 
    public final void foo (List<String> bar){ 
     for(String x : bar) 
      System.out.println(x); 
    } 
    public static void main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { 
     Test x = new Test(); 
     List<String> y = new ArrayList<String>(); y.add("asd"); y.add("bsd"); 
     x.getClass().getMethod("foo",List.class).invoke(x,y); 
    } 
} 

당신은 getMethod("foo",List.class)을 사용하고 List<String> 만 컴파일시에 사용되는 일반적인 정보로 List.class를 사용할 수 있습니다. 런타임에 메서드 서명은 일반적인 정보를 제거한다 컴파일시의 형태 삭제에 같은

public final void foo (List bar) 

처럼 보일 것입니다.