Java Generics и рефлексия! - PullRequest
       9

Java Generics и рефлексия!

4 голосов
/ 02 июня 2009

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

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

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

Ответы [ 3 ]

7 голосов
/ 02 июня 2009

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

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

0 голосов
/ 02 июня 2009

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

ct.setAccessible(true)

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

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