Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JayОтветов: 3

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

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);

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

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

javagenericsreflection

Ответы

Ответ 1 · рейтинг 7 · Jon Skeet

Конструктор защищен - если вы сделаете его общедоступным или используете 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.
    }
}

Ответ 2 · рейтинг 1 · fortran

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

Ответ 3 · Rob Di Marco

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

ct.setAccessible(true)

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы