• Réflexion & Généricité: instanciation d’un objet à visibilité privé

    Faisons un petit tour sur un sujet bien vaste la réflexion et la généricité. Je vous propose d’instancier un objet JAVA ayant un constructeur private sans utiliser le mot clé new.
    Prêt?

    Un bean Personne avec constructeur privé

    public class Personne {
    	private String nom;
    
    	private Personne() {
    	}
    
    	public String getNom() {
    		return nom;
    	}
    
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    

    Pour instancier cet objet utilisons l’outillage java.lang.reflect.*

    public class Genericite {
    
    	public static <T> T instanceObject(Class<T> clazz) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException{
    		Constructor<T> defaultConstructor =  clazz.getDeclaredConstructor();
    		defaultConstructor.setAccessible(true);
    		T t = defaultConstructor.newInstance();
    		return t;
    	}
    

    le setAccessible(true) nous permet en quelque sorte de « hacker » cette classe et changer la visibilité d’un constructeur.

    	public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
    		Personne p = Genericite.instanceObject(Personne.class);
    		p.setNom("Isma");
    		System.out.println(p.getNom());
    	}
    

    Ce mécanisme est très utilisé dans les framework tel que Spring.

    Categories: Java

    Étiquettes :

    Comments are currently closed.