Académique Documents
Professionnel Documents
Culture Documents
Programmation Avancée
Réflexivité et Introspection
Philippe Lahire
63
Introduction et définitions
• Réflexivité : Capacité à se décrire soit même
• Introspection
• Mécanisme qui permet l’accès dynamique à la structure d’un programme
• connaître/inspecter les classes, les objets, les méthodes à l'exécution
• Le faire dans le même langage = introspection réflexive
• Meta-programmation
• capacité de modifier les mécanismes du langage à l'aide d'un programme META
• Meta + réflex = inspecter et modifier le comportement
• Java = introspection réflexive, pas de protocole de méta-programmation
Utilisation :
Environnements de développement
Echange de classe dans les systèmes distribués
Programmation d’outils spécifiques Paquetage java.lang.reflect (et java.lang)
Des éléments syntaxiques
18/10/2023 Module de Programmation Avancée (application au langage Java) 64
64
1
18/10/2023
65
• Affiche à l’exécution
miage.m1.cm.Personne:Philippe L.
getClass retourne la classe obtenue par
miage.m1.cm.Etudiant:Henri L. liaison dynamique
18/10/2023 Module de Programmation Avancée (application au langage Java) 66
66
2
18/10/2023
67
68
3
18/10/2023
class
Class<T>
Interface
GenericArrayType
Interface
Interface ParametrizedType
WildcardType
getDeclaredAnnotation(Class<A>)
getDeclaredClasses0()
18/10/2023 Module de Programmation Avancée (application au langage Java) 69
69
70
4
18/10/2023
Méthodes (compléments)
• Class<?>[] getParameterTypes()
• int getParameterCount()
• Class<?> getReturnType
• Type getGenericReturnType()
• Method getRoot()
• boolean isDefault() dans les interfaces, non abstraites, liens avec
l’héritage multiple
71
Interface Interface
Class
interface Painter {
default void draw() {
Héritage simple System.out.println(“test...");
(attributs+méthodes) }
}
Interface Interface
Class
Héritage multiple
(méthodes)
Interface
72
5
18/10/2023
Utile pour charger des classes dont on ne connaît pas le nom à l'avance
18/10/2023 Module de Programmation Avancée (application au langage Java) 73
73
74
6
18/10/2023
75
76
7
18/10/2023
77
78
8
18/10/2023
79
80
9
18/10/2023
Nous allons voir comment obtenir la valeur des champs d'un objet
• on ne connaît pas l'objet à examiner à l'avance
• On ne connaît pas sa classe
81
82
10
18/10/2023
83
84
11
18/10/2023
85
86
12
18/10/2023
87
Exemple :
Exemple e; Class Exemple {
e = new exemple(); public ArrayList<Personne> tab_p;
Field f = e.getClass().getDeclaredField(" tab_p");
Type t = f.getGenericType(); exemple () {
System.out.print("type:"); tab_p = new ArrayList();
System.out.println(t.getTypeName()); }
Affichage :
type:java.util.ArrayList<miage.m1.td1.Personne>
88
13
18/10/2023
89
90
14
18/10/2023
Une solution pour simuler : p.getNom() où ‘p’ une instance de Personne et ‘m’ représente la
méthode getNom()
Method m = Personne.class.getMethod("getNom", null);
String n = (String) m.invoke(p, null);
91
92
15
18/10/2023
Interface Interface
Member GenericDeclaration
class class
class Parameter
AccessibleObject
Modifier
…
. Abstract
class
final class Executable
Field
93
16