{JAVA} reflexivite et generics

sechs Messages postés 5 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

Je cherche un moyen de connaitre le type de template/generics d'une list via la reflexivite

est t'il possible de connaitre le type du template au runtime pour pouvoir l'instancier via Class.forname(String templateClassName);

Merci de votre aide!
A voir également:

1 réponse

KX Messages postés 19031 Statut Modérateur 3 020
 
Je pense qu'il faut explicitement passer la classe, ou au minimum un objet de la classe du template, pour permettre de connaître ce type.

Attention : l'instanciation dynamique n'est pas toujours possible, il faut que le constructeur sans argument existe, ou alors invoquer un constructeur quelconque mais en lui fournissant dynamiquement des arguments (auquel il faudra aussi une valeur)

Exemple :

public class Toto
{
    private static int n = 0;
    private int id = n++;
    
    public String toString()
    {
        return String.format("id=%d",id);
    }
}

public class Test
{
    public static <E> ArrayList<E> create(int n, E obj)
    {
        return create(n,(Class<E>) obj.getClass());
    }
    
    public static <E> ArrayList<E> create(int n, Class<E> classe)
    {
        System.out.println(classe);
        
        ArrayList<E> liste = new ArrayList<E>();
        
        for (int i=0; i<n; i++)
        {
            try 
            {
                liste.add((E) classe.newInstance());
            } 
            catch (InstantiationException | IllegalAccessException e)
            {
                System.err.println(e);
                liste.add(null);
            }
        }
        
        return liste;
    }
    
    public static void main(String[] args)
    {
        ArrayList<Toto> liste = create(5,Toto.class);
        
        for (int i=0; i<liste.size(); i++)
            System.out.println(liste.get(i).toString());
        
        liste = create(5,new Toto());

        for (int i=0; i<liste.size(); i++)
            System.out.println(liste.get(i).toString());
    }
}
1
sechs Messages postés 5 Statut Membre
 
oui je comprend.
pour l'instanciation dynamique on est au courant.
Dans notre cas il est difficile d'avoir une instance de l'objet template,
on récupère nos infos sur une base sql et on a une instance vide d'une class totalement inconnue qu'on doit remplir via introspection donc le but c'est d'imposer a l'utilisateur développeur un minimum de contraintes comme nous donner une instance ou le nom du template...
mais après recherches il semble que le JAVA ne permette pas ca donc on va être oblige de faire comme ca
Merci beaucoup!
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Si tu as "une instance vide d'une class totalement inconnue" c'est suffisant, tu peux utiliser cette instance pour faire un newInstance(), et même si tu n'as que le nom de cette classe avec forName.

Pour plus d'infos regarde : Restrictions on Generics, Cannot Create Instances of Type Parameters
0