2009-06-02 4 views
4

У меня есть класс, который выглядит следующим образом:Java Generics and reflection!

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

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

+0

ЧТО ТАКОЕ «формат»? –

+0

Формат представляет собой реализацию: public interface FormatFactory { \t public Map getFormat(); \t общественный класс getMappingBean(); } – Jay

ответ

7

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

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

EDIT: Вот тест, чтобы показать это работает нормально:

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. 
    } 
} 
+0

Или используйте getDeclaredConstructor(), как я только что узнал (но слишком поздно!). –

+0

не работает повторяет это исключение: java.lang.NoSuchMethodException: test.fileupload.XYZUploadBean. (java.util.Map) – Jay

+0

Будет ли getDeclaredConstructor(), тогда требуется setAccessible (true)? В моих тестах это не так, но я не пытался отделить main() от UploadBean. –

0

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

ct.setAccessible(true) 

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

1

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

+1

Да, ошибка действительно не имеет ничего общего с дженериками; это действительно просто вопрос размышлений. (Но приятно прояснить этот момент.) –

+0

@mmyers согласились. – Jay