2009-06-02 11 views
4

J'ai une classe qui ressemble à ceci:Java Génériques et réflexion!

public class UploadBean { 


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

Pour utiliser la réflexion et créer un objet en invoquant le constructeur correspondant, j'écrit le code comme suit:

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

Ce code échoue à l'exécution avec "Aucune exception de méthode". Maintenant, comment régler le type de param? de sorte que l'argument de la carte générique dans le constructeur est identifié?

+0

Qu'est-ce que c'est «format»? –

+0

Le format est une implémentation de ceci: public interface FormatFactory { \t public Map getFormat(); \t public class getMappingBean(); } – Jay

Répondre

7

Le constructeur est protégé - si vous le faites publique ou utilisation getDeclaredConstructor au lieu de getConstructor il devrait fonctionner.

(. Vous aurez besoin d'utiliser setAccessible si vous essayez d'appeler cela de quelque part que vous auriez normalement pas accès)

EDIT: Voici un test pour montrer travail correct:

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

Ou utilisez getDeclaredConstructor(), comme je viens de le découvrir (mais trop tard!). –

+0

ne fonctionne pas renvoie à nouveau cette exception: java.lang.NoSuchMethodException: test.fileupload.XYZUploadBean. (java.util.Map) – Jay

+0

GetDeclaredConstructor() nécessiterait-il setAccessible (true)? Dans mes tests, ce n'est pas le cas, mais je n'ai pas essayé de séparer main() de UploadBean. –

0

Je crois que vous devez appeler

ct.setAccessible(true) 

La méthode setAccessible vous permet de remplacer les méthodes d'accès.

1

Les informations génériques ne sont pas disponibles au moment de l'exécution, elles sont uniquement destinées à l'analyse statique, faites-le comme si les génériques n'existaient pas.

+1

Oui, l'erreur n'a vraiment rien à voir avec les génériques; c'est vraiment juste une question de réflexion. (Mais il est bon de clarifier ce point.) –

+0

@mmyers convenu. – Jay