使用泛型的Java反射方法调用

时间:2009-11-18 01:40:32

标签: java generics reflection

鉴于此方法:

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

我希望能够反思地调用这个方法。为了使getMethod工作,我必须将其更改为:

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

由于显而易见的原因,这似乎不正确,但getMethod的输入组合似乎不起作用。我在谷歌搜索高低都无济于事。有什么建议吗?

干杯谢谢!

2 个答案:

答案 0 :(得分: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.class,因为通用信息List<String>仅在编译时使用。在运行时,方法签名看起来像

public final void foo (List bar)

在编译时类型擦除中删除了通用信息。

答案 1 :(得分: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>());
    }
}