Отражение: Как найти конструктор, который принимает список объектов? - PullRequest
5 голосов
/ 09 июня 2011

У меня есть класс, который принимает List в конструкторе;

public class MyClass {

       private List<Structure> structures;

       public MyClass(List<Structure> structures) {
          this.structures = structures;
       }
}

, который мне нужно создать с помощью отражения.Как мне определить вызов class.getConstructor (), чтобы найти это?

С уважением

Ответы [ 2 ]

8 голосов
/ 09 июня 2011

Это должно работать:

Constructor<MyClass> constructor = MyClass.class.getConstructor(List.class);

или

Constructor constructor = MyClass.class.getConstructor(new Class[]{List.class});

для Java 1.4.x или меньше

5 голосов
/ 09 июня 2011

Вы можете найти его, просто введя List.class.Например:

import java.util.*;
import java.lang.reflect.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;
        Constructor<?> ctor = clazz.getConstructor(List.class);

        ctor.newInstance(new Object[] { null });
    }
}

Если вам нужно проверить универсальные типы параметров, вы можете использовать getGenericParameterTypes и проверить Type[], который он возвращает.Например:

Type[] types = ctor.getGenericParameterTypes();
System.out.println(types[0]); // Prints java.util.List<Structure>

Вам не нужно указывать аргумент типа при вызове getConstructor, потому что вы не можете перегрузить конструктор, используя параметры с просто параметрами другого типа,Эти типы параметров будут иметь одинаковое стирание типа .Например, если вы попытаетесь добавить другой конструктор с этой подписью:

public MyClass(List<String> structures)

, вы получите ошибку, подобную этой:

MyClass.java: 7: name clash:MyClass(java.util.List<java.lang.String>) и MyClass(java.util.List<Structure>) имеют одинаковое стирание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...