Вызов рефлексивного метода Java с использованием обобщений - PullRequest
1 голос
/ 18 ноября 2009

Учитывая этот метод:

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

Я хочу иметь возможность вызывать этот метод рефлексивно. Чтобы getMethod работал, я должен изменить его на:

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

Это кажется неправильным по очевидным причинам, но никакая комбинация входных данных для getMethod, похоже, не работает иначе. Я искал высоко и низко в Google безрезультатно. Любой совет?

Ура и спасибо!

Ответы [ 2 ]

6 голосов
/ 18 ноября 2009
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)

как при стирании типа во время компиляции избавляется от общей информации.

2 голосов
/ 18 ноября 2009

У меня работает.

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>());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...