2009-06-02 16 views
4

ich eine Klasse, die wie folgt aussieht:Java Generics und Reflexion!

public class UploadBean { 


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

Reflexion zu verwenden und ein Objekt erstellen, indem Sie den entsprechenden Konstruktor aufgerufen wird, schrieb ich Code wie folgt:

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

Dieser Code zur Laufzeit nicht mit "Keine solche Methode Ausnahme". Nun, wie stelle ich den Param-Typ richtig ?! so dass das generische map-Argument im Konstruktor identifiziert wird?

+0

WHat ist "Format"? –

+0

Format ist eine Implementierung von dieser: öffentliche Schnittstelle FormatFactory { \t öffentliche Karte getFormat(); \t öffentliche Klasse getMappingBean(); } – Jay

Antwort

7

Der Konstruktor ist geschützt - wenn Sie es öffentlich oder Verwendung getDeclaredConstructor statt getConstructor es funktionieren sollte zu machen.

(. Sie müssen setAccessible verwenden, wenn Sie versuchen, dies rufen von irgendwo würden Sie normalerweise keinen Zugang haben)

EDIT: Hier ist ein Test, es zu zeigen Arbeiten in Ordnung:

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

Oder benutze getDeclaredConstructor(), wie ich gerade herausgefunden habe (aber zu spät!). –

+0

funktioniert nicht löst diese Ausnahme erneut aus: java.lang.NoSuchMethodException: test.fileupload.XYZUploadBean. (java.util.Map) – Jay

+0

Würde getDeclaredConstructor() dann setAccessible (true) erfordern? In meinen Tests tut es das nicht, aber ich habe nicht versucht, main() von der UploadBean zu trennen. –

0

ich glaube, Sie

ct.setAccessible(true) 

Die setAccessible Methode aufrufen müssen können Sie Zugriffsmethoden außer Kraft zu setzen.

1

Die generische Information ist zur Laufzeit nicht verfügbar, es ist nur für die statische Analyse, so tun, als ob die Generika nicht existierten.

+1

Ja, der Fehler hat wirklich nichts mit Generika zu tun; Das ist wirklich nur eine Reflexionsfrage. (Aber es ist schön, diesen Punkt zu klären.) –

+0

@mmyers stimmte zu. – Jay