Java Generics и отражение!

У меня есть класс, который выглядит так:

public class UploadBean {


    protected UploadBean(Map<String,?> map){ 
        //do nothing.
    }
}

Чтобы использовать отражение и создать объект, вызвав соответствующий конструктор, я написал следующий код:

Class<?> parTypes[] = new Class<?>[1];
parTypes[0] = Map.class;
Constructor ct = format.getMappingBean().getConstructor(parTypes);
Object[] argList  = new Object[1];
argList[0] = map;
Object retObj = ct.newInstance(argList);

Этот код завершается с ошибкой во время выполнения с сообщением «Нет такого исключения метода». Теперь, как мне правильно установить тип параметра?! таким образом, чтобы общий аргумент карты в конструкторе был идентифицирован?


person Jay    schedule 02.06.2009    source источник
comment
Формат является реализацией этого: открытый интерфейс FormatFactory { public Map‹String, Class› getFormat(); публичный класс‹? расширяет UploadBean> getMappingBean(); }   -  person Jay    schedule 02.06.2009


Ответы (3)


Конструктор защищен — если вы сделаете его общедоступным или используете getDeclaredConstructor вместо getConstructor, он должен работать.

(Вам нужно будет использовать setAccessible, если вы пытаетесь вызвать это откуда-то, к чему у вас обычно нет доступа.)

РЕДАКТИРОВАТЬ: вот тест, чтобы показать, что он работает нормально:

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

public class UploadBean {

    // "throws Exception" just for simplicity. Not nice normally!
    public static void main(String[] args) throws Exception {
        Class<?> parTypes[] = new Class<?>[1];
        parTypes[0] = Map.class;
        Constructor ct = UploadBean.class.getDeclaredConstructor(parTypes);
        Object[] argList  = new Object[1];
        argList[0] = null;
        Object retObj = ct.newInstance(argList);
    }

    protected UploadBean(Map<String,?> map){ 
        //do nothing.
    }
}
person Jon Skeet    schedule 02.06.2009
comment
Или используйте getDeclaredConstructor(), как я только что узнал (но слишком поздно!). - person Michael Myers; 02.06.2009
comment
не работает снова выдает это исключение: java.lang.NoSuchMethodException: test.fileupload.XYZUploadBean.‹init›(java.util.Map) - person Jay; 02.06.2009
comment
Будет ли getDeclaredConstructor() требовать setAccessible(true)? В моих тестах это не так, но я не пытался отделить main() от UploadBean. - person Michael Myers; 02.06.2009
comment
@Jay: Пожалуйста, предоставьте короткую, но полную программу. Если вы используете правильный класс и у него правильный конструктор, все должно быть в порядке. В моих тестах работает. - person Jon Skeet; 02.06.2009
comment
В частности, есть ли у XYZUploadBean правильный конструктор? Вы показали UploadBean, но не XYZUploadBean... - person Jon Skeet; 02.06.2009

Универсальная информация недоступна во время выполнения, она предназначена только для статического анализа, поэтому делайте это так, как будто дженериков не существует.

person fortran    schedule 02.06.2009
comment
Да, ошибка действительно не имеет ничего общего с дженериками; это действительно просто вопрос для размышления. (Но было бы неплохо уточнить этот момент.) - person Michael Myers; 02.06.2009

Я считаю, что вам нужно позвонить

ct.setAccessible(true)

Метод setAccessible позволяет переопределить методы доступа.

person Rob Di Marco    schedule 02.06.2009