Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.

Slides:



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

Spécialisation/généralisation Héritage Polymorphisme
Introspection et Réflexion Manipulation dynamique de code Java.
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.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
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.
Programmation Réseaux Illustration : Les Sockets en Java
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.
Approfondissement du langage
(Classes prédéfinies – API Java)
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
Les technologies XML Cours 3 : Les APIS XML Janvier Version 1.0 -
Programmer en JAVA par Tama
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Programmation par Objets et Java
Principes de programmation (suite)
Programmation orientée objet
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
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.
Principes de programmation (suite)
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.
Langage Oriente Objet Cours 2.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
À travailler seuls Concepts généraux Mise en œuvre Java Année
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 Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Introduction au paradigme orienté-objet (suite)
Présentation Structures de Données et TDA
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
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.
IFT 6800 Atelier en Technologies d’information
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.
Types de données abstrait et mécanismes d'encapsulation
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.
Cours 4 Héritage (suite).
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
11/04/ L'héritage Cours 7 Cours 7.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Cours 7 Classes locales Clonage Divers: tableaux.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Strings et Tableaux 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.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Héritage Conception par Objet et programmation Java
Classes abstraites, interface Classe interne Classes enveloppes
LES CLASSES ET LES OBJETS
Transcription de la présentation:

Java et la réflexivité

Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing Java program. This feature is extremely powerful and has no equivalent in other conventional languages such as C, C++, Fortran, or Pascal. Glen McCluskey has focused on programming languages since He consults in the areas of Java and C++ performance, testing, and technical documentation.

Réflexivité en Java ? La réflexivité en Java permet à un programme Java de sexaminer en cours dexécution de manipuler ses propriétés internes. Par exemple, une classe Java peut obtenir le nom de tous ses membres. Utilisation connue de la réflexivité : la composition visuelle de Beans Loutil utilise la réflexivité pour obtenir les propriétés des composants (classes) lorsquils sont dynamiquement chargés.

Que peut on faire ? Obtenir des informations sur les classes Simuler lopérateur instanceof Découvrir la liste et le descriptif des méthodes Obtenir des informations sur les constructeurs Avoir des informations sur les variables Invoquer des méthodes, des constructeurs, affecter des variables Créer des objets et des tableaux dynamiquement lors de l exécution du programme sans connaître à la compilation le nom et les arguments dune méthode / constructeur le nom de la variable le type des objets, des tableaux….

Réflexivité = un package Java java.lang.reflect.* des classes : Object AccessibleObject Constructor Field Method Array InvocationTargetException Modifier ReflectPermission une interface : Member

Un exemple simple public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0]); Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].toString()); } catch (Throwable e) {System.err.println(e);} } public java.lang.Object java.util.Stack.push(java.lang.Object) public synchronized java.lang.Object java.util.Stack.pop() public synchronized java.lang.Object java.util.Stack.peek() public boolean java.util.Stack.empty() public synchronized int java.util.Stack.search(java.lang.Object) java.util.Stack

Oui mais comment ? Comment travailler avec les classes du package reflect ? Obtenir un objet java.lang.Class Récupérer des informations sur la classe Utiliser lAPI de reflect Illustration à partir de lexemple

Classe Class Les instances de Class représentent les classes et les interfaces dune application Java. Tous les tableaux sont aussi instances de Class (type des éléments, dimension). Les types primitifs (boolean, byte, char, short, int, long, float, double) et le mot clé void sont aussi des objets Class. Cette classe na pas de constructeur public. Les instances sont créées automatiquement par la VM lorsque les classes sont chargées et par la méthode defineClass des class loader.

Obtenir un objet java.lang.Class représentant de la classe que lon veut manipuler : Pour les types fondamentaux Class c = int.class; ou Class c = Integer.TYPE; TYPE est une variable prédéfinie du wrapper (Integer, par exemple) du type fondamental. Pour les autres classes Class c = Class.forName("java.lang.String");

Récupérer des informations sur la classe Appeler une méthode sur lobjet classe récupéré : getDeclaredMethods : pour obtenir la liste de toutes les méthodes déclarées dans la classe getConstructors : pour obtenir la liste des constructeurs dans la classe getDeclaredFields : pour obtenir la liste des variables déclarées dans la classe (quelque soit laccesseur et non héritée) getFields : pour obtenir la liste des variables publiques accessibles....

Utiliser lAPI de reflect Par exemple : Class c = Class.forName("java.lang.String"); Method m[] = c.getDeclaredMethods(); System.out.println(m[0]).toString()); pour manipuler linformation

Comment Simuler lopérateur instanceOf public class instance1 { public static void main(String args[]) {try {Class cls = Class.forName("A"); boolean b1 = cls.isInstance(new Integer(37)); System.out.println(b1); boolean b2 = cls.isInstance(new A()); System.out.println(b2); } catch (Throwable e) {System.err.println(e)} } Il existe une Classe A et on veut vérifier si certaines instances sont de cette classe ou pas. FALSE TRUE

classe AccessibleObject et interface Member AccessibleObject : Classe de base de Field, Method et Constructor. Permet de supprimer ou de valider la vérification faite par défaut concernant les contrôles daccès. Ces vérifications (sur private, public, package..) sont effectuées lorsquon affecte ou lit des champs, lorsquon invoque une méthode et lorsquon crée une instance. Member : interface qui réifie les informations communes à un membre (champ ou méthode) ou à un constructeur.

Classes Method, Field et Constructor Method fournit les informations et les accès à une méthode (de classe, dinstance ou abstraite) dune classe ou dune interface. Field fournit les informations et accès dynamiques aux champs (static ou dinstances) dune classe ou dune interface. Constructor fournit des informations et des accès à un constructeur dune classe.

Les méthodes dune classe ? 1.récupérer l objet Class que lon souhaite observer, 2.récupérer la liste des objets Method par getDeclaredMethods : méthodes définies dans cette classe (public, protected, package, et private) getMethods permet dobtenir aussi les informations concernant les méthodes héritées 3.A partir des objets méthodes il est facile de récupérer : les types de paramètres, les types dexception, et le type de largument retourné sous la forme dun type fondamental ou dun objet classe.

Exemple de programme Class cls = Class.forName("method1"); Method methlist[] = cls.getDeclaredMethods(); for (int i = 0; i < methlist.length; i++) { Method m = methlist[i]; System.out.println("name = " + m.getName()); System.out.println("decl class = " + m.getDeclaringClass()); Class pvec[] = m.getParameterTypes(); for (int j = 0; j < pvec.length; j++) System.out.println("param #" + j + " " + pvec[j]); Class evec[] = m.getExceptionTypes(); for (int j = 0; j < evec.length; j++) System.out.println("exc #" + j + " " + evec[j]); System.out.println("return type = " + m.getReturnType());}

Exemple dexécution name = f1 decl class = class method1 param #0 class java.lang.Object param #1 int exc #0 class java.lang.NullPointerException return type = int name = main decl class = class method1 param #0 class java.lang.String return type = void public class method1 { private int f1(Object p, int x) throws NullPointerException {……..} public static void main(String args[]) {….}

Informations sur les constructeurs Les constructeurs sont similaires aux méthodes mais ne renvoient pas de résultat

Découverte des variables Similaire à la découverte de méthodes et de constructeurs. lutilisation de la classe Modifier. Modifier représente les modifiers des variables (private int...). Ils sont eux mêmes représentés par un integer, Modifier.toString renvoie la chaine correspondant à lordre « officiel » ("static" avant "final"). On peut obtenir les informations sur les variables définies dans les super classes par getFields.

Invocation des méthodes par leur nom Equivalent du apply de Scheme pour invoquer une méthode m dont le nom est spécifié à lexécution (dans le cadre de lenvironnement de développement des JavaBeans par exemple) 1.Trouver une méthode dans une classe getMethod à partir des types de ses paramètres et de son nom. 2. La stocker dans un objet Method 3.Construire la liste des paramètres dappel 4. Faire lappel Si on manipule un type fondamental à lappel ou au retour lencapsuler dans la classe correspondante (int, Integer)

Exemple de programme Class cls = Class.forName("method2"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Method meth = cls.getMethod("add",partypes); method2 methobj = new method2(); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj = meth.invoke(methobj, arglist); Integer retval = (Integer)retobj; System.out.println(retval.intValue())

Exemple dexécution public class method2 { public int add(int a, int b) { return a + b; } public static void main(String args[]) {…… …… } ?

Création de nouveaux objets Invoquer un constructeur implique de créer un nouvel objet (allouer de la mémoire et construire lobjet) 1.Trouver un constructeur qui accepte les types spécifiés 2.Linvoquer Création purement dynamique avec recherche (lookup) du constructeur et invocation à lexécution et non à la compilation.

Utilisation des tableaux Création et manipulation des tableaux. Array = un type spécial de classe Le type du tableau qui est créé est dynamique et na pas besoin dêtre connu à la compilation

Réflexivité = un package Java java.lang.reflect.* des classes : Object AccessibleObject Constructor Field Method Array InvocationTargetException Modifier ReflectPermission une interface : Member

Exemples concrets dapplications Je vous écoute …….

Un peu plus de réflexivité Les ClassLoader ????

Classe ClassLoader ClassLoader est une classe abstraite. Un class loader est un objet responsable du chargement des classes Un nom de classe donné, il peut localiser ou générer les données qui constituent une définition de la classe. Chaque objet Class a une référence à un ClassLoader qui le définit. Applications implémentent des sous classes de ClassLoader afin détendre la façon de dynamiquement charger des classes par la VM. (utilisation de manager de sécurité, par exemple) Le chargement fonctionne par délégation

ClassLoader ? En UNIX la VM charge les classes à partir des chemins définis dans CLASSPATH (checkClassPath sous VA). Certaines classes peuvent être obtenues à partir dautres sources, telles que le réseau ou construite par une application. La méthode defineClass convertit un tableau doctets en une instance de Class. Instances pouvant être créées grâce à newInstance Les méthodes et constructeurs créés par un class loader peuvent référencer dautres classes (loadClass du class loader de cette classe).

Exemple de chargement de classe Un class loader qui permet de charger des fichiers de classes via le réseau ClassLoader loader=new NetworkClassLoader(host,port); Object main= loader.loadClass("Main", true).newInstance(); …. NetworkClassLoader doit définir findClass et loadClassData pour charger et defineClass pour créer une instance de Class.

NetworkClassLoader class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection ….. }}

Conclusion Je vous écoute ….

Quelques Informations utiles sur la sérialisation Java

Sérialisation-Desérialisation Enregistrer ou récupérer des objets dans un flux –Persistance –Transfert sur le réseau

Sérialisation Via la méthode writeObject() –Classe implémentant linterface OutputObject –Exemple : la classe OutputObjectStream –Sérialisation dun objet -> sérialisation de tous les objets contenus par cet objets Un objet est sauvé quune fois : cache pour les listes circulaires

Desérialisation Via la méthode readObject() –Classe implémentant linterface InputObject –Exemple : la classe InputObjectStream

Exception NotSerializableException Si la classe de lobjet sauvé –Nétend ni linterface Java Serializable –Ni linterface Java Externalizable

Interface Serializable Ne contient pas de méthode -> enregistrement et récupération de toutes les variables dinstances (pas de static) + informations sur sa classe (nom, version), type et nom des variables 2 classes compatibles peuvent être utilisées Objet récupéré = une copie de lobjet enregistré

Gestion de la sérialisation desérialisation Implémenter les méthodes private void writeObject(OutputObjectStream s) throws IOException private void readObject(OutputInputStream s) throws IOException defaultReadObject() et defaultWriteObject() méthodes par défaut Ajout dinformations à lenregistrement, choix de sérialisation Seulement pour les champs propres de la classe (héritage géré automatiquement)

Gestion complète de la sérialisation desérialisation : utiliser Externalizable Graphe dhéritage complet Implémenter les méthodes public void writeExternal(ObjectOutput o) throws IOException public void readExternal(ObjectInput o) throws IOException –ATTENTION PBM de SECURITE