Introspection et Réflexion Manipulation dynamique de code Java.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Spécialisation/généralisation Héritage Polymorphisme.
Spécialisation/généralisation Héritage Polymorphisme
Le mécanisme des exceptions
1 Quelques précisions sur l'héritage. 2 Signification de super.f() appel à la méthode f() masquée super : désigne l'objet appelant comme s'il était de.
A propos de java Sun, fin 1995 C++ nettoyé semi-interprété
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Au programme du jour …. Introduction à lhéritage Un concept important de la programmation objet Livraison de code Organisation des répertoires et packages.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Au programme du jour …. Livraison de code Organisation des répertoires et packages Ce que vous navez pas encore vraiment vu Constantes et variables de.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Java et la réflexivité.
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
Au programme du jour …. Livraison de code Organisation des répertoires et packages Ce que vous navez pas encore vraiment vu Constantes et variables de.
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
(Classes prédéfinies – API Java)
Programmer en JAVA par Tama
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Programmation orientée objet
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
1 Cours JAVA / Y.Laborde Java : Les types génériques ( ) LES TYPES GENERIQUES : Introduction (diapo 2) Déclaration dun type générique (3) 1re déclaration.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
POO-L3 H. Fauconnier1 C) Méthodes: Redéfinition Un classe hérite des méthodes des classes ancêtres Elle peut ajouter de nouvelles méthodes Elle peut surcharger.
Principes de programmation (suite)
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
IFT1025, Programmation 2 Jian-Yun Nie
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
Java Héritage, interfaces.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
POO : Objets et classes (Rappels)
1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.
Langage Oriente Objet Cours 2.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction à la programmation objet Langage Java
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Introduction au paradigme orienté-objet (suite)
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
Design Pattern: Decorator
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 4 Héritage (suite).
Cours 5 Héritage, Interfaces, classes internes. POO-L3 H. Fauconnier2 La classe Object Toutes les classes héritent de la classe Object Object méthodes:
COURS DE PROGRAMMATION ORIENTEE OBJET :
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
4 Introduction des objets. Les chaînes et tableaux
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
11/04/ L'héritage Cours 7 Cours 7.
Cours 7 Classes locales Clonage Divers: tableaux.
Tutorat en bio-informatique
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 3 – Classes et objets en Java Master 1 SIGLIS1 Java Lecteur - Chapitre 3 Classes et objets en Java.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Cours du 5 novembre.
IUT du Limousin L.U.P Michel Vergnaud Programmation Objet - Java.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
IUT du limousin L.U.P Michel Vergnaud Programmation Objet - Java.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
LES CLASSES ET LES OBJETS
Transcription de la présentation:

Introspection et Réflexion Manipulation dynamique de code Java

Principe Classes et méthodes permettant –Accès à linformation sur les classes attributs méthodes constructeurs –Manipulation des objets de ces classes modification dattributs appel de constructeurs appel de méthodes Pendant lexécution Limites en Java : pas de modification des classes, ex. ajout dattributs ou de méthodes

Utilisation réalisation de Débogueurs Interprètes Inspecteurs dobjets Navigateur de classes (class browsers) Services particuliers, ex. –Sérialization (sauvegarde dobjets) –Editeurs dobjets –Intercession (interception dappels)

Principales classes java.lang Class classe java.lang.reflect Fieldattribut Constructor constructeur Methodméthode

Principales classes Class –le type de String.class est Class –ses fields, constructors, methods, interfaces, classes,.. Field –son type, sa classe, sa valeur pour un objet,.. Constructor –ses paramètres, exceptions,.. Method –ses paramètres, type de retour, exceptions,..

Contextes dutilisation Sans volonté dexhaustivité, quelques exemples classiques dutilisation... Inspection des méthodes Inspection dobjets Création dobjets selon des types non connus au préalable Appel de méthodes

Inspection des méthodes Eléments utilisés –Class, Method String getName() –Class static Class forName(String c) –retourne linstance représentant la classe nommée c Method[] getMethods() –retourne les méthodes publiques de la classe –Method Class getReturnType() Class[] getParameterTypes()

Inspection des méthodes abstract class Produit{ private String reference,designation; private double prixHT; public Produit(){} public Produit(String r,String d,double p) {reference=r; designation=d; prixHT=p;} public String getReference(){return reference;} public void setReference(String r){reference=r;} public String getDesignation(){return designation;} public void setDesignation(String d){designation=d;} public double getPrixHT(){return prixHT;} public void setPrixHT(double p){prixHT=p;} abstract public double leprixTTC(); public String infos(){return getReference()+" "+ getDesignation()+" "+leprixTTC();} }

Inspection des méthodes class ProduitTNormal extends Produit { public ProduitTNormal(){} public ProduitTNormal(String r,String d,double p) {super(r,d,p);} public double leprixTTC() {return getPrixHT() * 1.196;} } class Livre extends ProduitTNormal { private String editeur; public Livre(){} public Livre(String r,String d,double p,String e) {super(r,d,p);editeur=e;} public String getEditeur(){return editeur;} public void setEditeur(String e){editeur=e;} public String infos(){return super.infos()+" "+getEditeur();} }

Inspection des méthodes package Cours Exemples; import java.lang.reflect.*; // Class est dans java.lang // Method est dans java.lang.reflect

Inspection des méthodes public class TestReflexion { public static void afficheMethodesPubliques(Class cl) { Method[] methodes = cl.getMethods(); for (int i=0; i<methodes.length; i++) {Method m = methodes[i]; String m_name = m.getName(); Class m_returnType = m.getReturnType(); Class[] m_paramTypes = m.getParameterTypes(); System.out.print(" "+m_returnType.getName()+ " "+m_name + "("); for (int j=0; j<m_paramTypes.length; j++) System.out.print(""+m_paramTypes[j].getName()); System.out.println(")"); }..... }

Inspection des méthodes public class TestReflexion {.... public static void main(String[] argv) throws java.lang.ClassNotFoundException { System.out.println("Saisir un nom de classe"); Scanner s=new Scanner(System.in); String nomClasse = s.nextLine(); Class c = Class.forName(nomClasse); TestReflexion.afficheMethodesPubliques(c); } }//fin TestReflexion

Inspection des méthodes Saisir un nom de classe << Cours Exemples.Livre >> java.lang.String getEditeur() Livre >> void setEditeur( java.lang.String) >> java.lang.String infos() >> double leprixTTC()ProduitTNormal >> double getPrixHT() Produit >> java.lang.String getReference()..... >> int hashCode() Object >> java.lang.Class getClass() >> boolean equals( java.lang.Object) >> java.lang.String toString()

Inspection des objets Eléments utilisés –Object Class getClass() –retourne la classe de lobjet –Class String getName() Field getField(String n) –retourne lattribut nommé n –Field Object get(Object o) –retourne la valeur de lattribut pour lobjet o

Inspection des objets Produit p = new Livre("X23","Paroles de Prévert",25,"Folio"); System.out.println(p.getClass().getName()); >> Cours Exemples.Livre p = new Aliment("A21","Pain dépices", 12,"BonMiel"); System.out.println(p.getClass().getName()); >> Cours Exemples.Aliment

Accès aux attributs public // editeur et prixHT sont maintenant public Livre p = new Livre("X23","Paroles de Prévert",25,"Folio"); Class p_class = p.getClass(); Field f1_p = p_class.getField("editeur"); Object v_f1_p = f1_p.get(p); Field f2_p = p_class.getField("prixHT"); Object v_f2_p = f2_p.get(p); System.out.println("v_f1_p="+v_f1_p+" v_f2_p="+v_f2_p); >> v_f1_p=Folio v_f2_p=25.0

Accès aux attributs privés f1_p.setAccessible(true); méthode héritée de AccessibleObject

Créer des objets Eléments utilisés –Class static Class forName(String) Constructor getConstructor (); –retourne lattribut nommé n –Constructor Object newInstance() –retourne la valeur de lattribut pour lobjet o

Créer des objets System.out.println("Livre ou Aliment ?"); Scanner s=new Scanner(System.in); String nomClasse = s.nextLine(); Object np; // et maintenant on voudrait créer // un livre ou un aliment

Créer des objets code classique System.out.println("Livre ou Aliment ?"); Scanner s=new Scanner(System.in); String nomClasse = s.nextLine();Object np; if (nomClasse.equals ("Cours Exemples.Livre")) {np = new Livre();} else if (nomClasse.equals ("Cours Exemples.Aliment")) {np = new Aliment();} else if... Pb extensibilité : ajout de classe, modification de nom de classe modification de code

Créer des objets avec la réflexion System.out.println("Livre ou Aliment ?"); Scanner s=new Scanner(System.in); String nomClasse = s.nextLine(); Object np; Class c = Class.forName(nomClasse); Constructor constructeur=c.getConstructor(); np = constructeur.newInstance(); np.saisie(..);...

Créer des objets avec la réflexion Pour appeler un constructeur prenant des paramètres Constructor constructeur = c.getConstructor( String.class, String.class, double.class, String.class); np = constructeur. newInstance(xx",Paroles", 12,Folio");

Appeler des méthodes Eléments utilisés –Class Method getMethod(String n) –retourne la méthode nommée n –Method Object invoke(Object) –appelle la méthode sur lobjet o

Appeler des méthodes System.out.println ("Méthodes existantes sur np"); TestReflexion.afficheMethodesPubliques(c); >>... >> java.lang.String infos() >> double leprixTTC() >> double getPrixHT() >>.... System.out.println("Quelle méthode sans argument voulez-vous appeler ?"); String nomMeth = s.nextLine(); << leprixTTC Method meth = c.getMethod(nomMeth); Object resultat = meth.invoke(np); System.out.println("resultat = "+resultat); >> resultat =

Appeler des méthodes avec des paramètres meth = c.getMethod("setEditeur", String.class); resultat = meth.invoke(np,"Gallimard"); System.out.println("nouvel objet = "+np);

On peut aussi... accéder aux modifiers connaître les super-classes, les interfaces créer et manipuler des tableaux créer des proxys de classes ou dinstances pour intercepter des appels et ajouter du comportement (ex. tracer automatiquement) /reflect/package-summary.html