Extension dynamique et réflexion. USTL routier 1

Documents pareils
Programmer en JAVA. par Tama

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmation Par Objets

Package Java.util Classe générique

Remote Method Invocation (RMI)

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Threads. Threads. USTL routier 1

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Programmation Objet Java Correction

Héritage presque multiple en Java (1/2)

Auto-évaluation Programmation en Java

Corrigé des exercices sur les références

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Dis papa, c est quoi un bus logiciel réparti?

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Développement Logiciel

RMI le langage Java XII-1 JMF

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

F. Barthélemy. 17 mai 2005

OpenPaaS Le réseau social d'entreprise

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

PROGRAMMATION PAR OBJETS

Synchro et Threads Java TM

Chapitre 10. Les interfaces Comparable et Comparator 1

Une introduction à Java

LOG4430 : Architecture logicielle et conception avancée

Remote Method Invocation en Java (RMI)

Java Licence Professionnelle CISII,

as Architecture des Systèmes d Information

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Un ordonnanceur stupide

Objets et Programmation. origine des langages orientés-objet

Serveur d'archivage 2007 Installation et utilisation de la BD exist

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Java 1.5 : principales nouveautés

Premiers Pas en Programmation Objet : les Classes et les Objets

Calcul Parallèle. Cours 5 - JAVA RMI

Cours 1: Java et les objets

INITIATION AU LANGAGE JAVA

TP1 : Initiation à Java et Eclipse

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Projet de programmation (IK3) : TP n 1 Correction

Programme Compte bancaire (code)

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Chapitre VI- La validation de la composition.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TD/TP PAC - Programmation n 3

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Remote Method Invocation Les classes implémentant Serializable

TD3: tableaux avancées, première classe et chaînes

La JVM. La machine virtuelle Java. La JVM. La JVM

Java DataBaseConnectivity

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Introduction au langage Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Derrière toi Une machine virtuelle!

ACTIVITÉ DE PROGRAMMATION

Création d une application JEE

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Corrigés des premiers exercices sur les classes

Plan du cours. Historique du langage Nouveautés de Java 7

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programmation par les Objets en Java

Programmation avec des objets : Cours 7. Menu du jour

Design patterns. Design patterns - définition. Design patterns - avantages

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Exercices sur les interfaces

Flux de données Lecture/Ecriture Fichiers

Langage à objets : JAVA (1)

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Environnements de développement (intégrés)

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Applet pour visualiser les variables «automate» notifiées

Le Modèle de Sécurité dans JAVA

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Initiation à JAVA et à la programmation objet.

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

TP Programmation Java / JDBC / Oracle

Création d un service web avec NetBeans 5.5 et SJAS 9

Généralités sur le Langage Java et éléments syntaxiques.

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Création d objet imbriqué sous PowerShell.

TD/TP PAC - Programmation n 3

Gestion distribuée (par sockets) de banque en Java

1 Définition d une classe en Java

Java c est quoi? Java pourquoi?

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

Une introduction à la technologie EJB (2/3)

Machines virtuelles fonctionnelles (suite) Compilation ML Java

TP, première séquence d exercices.

Transcription:

Extension dynamique et réflexion USTL http://www.lifl.fr/ routier 1

Extension dynamique Java offre la possibilité d avoir des programmes qui s étendent dynamiquement : permet un programme P de charger des classes qui n existaient pas au moment de la programmation/compilation de P et de créer et manipuler des instances de ces classes. Réflexion Java permet à un programme de manipuler et d analyser dynamiquement les objets du programme eux-mêmes introspection USTL http://www.lifl.fr/ routier 2

Schéma objet méta-circulaire les classes sont des instances de Class et donc des objets possèdent attributs : les attributs des instances, leurs méthodes, etc. possèdent méthodes (on peut donc leur envoyer des messages) création d instances, connaître la valeur de ses attributs appeler des méthodes la classe Object est une classe et donc une instance de Class, elle peut donc être manipulée aussi en quelque sorte (pas tout à fait en Java) : class UneClasse {... Class UneClasse = new Class(...); USTL http://www.lifl.fr/ routier 3

Extension dynamique 2 manières de charger (dynamiquement) une classe en mémoire : Class.forName(String) ClassLoader:loadClass(String) (sous-classes de) puis création dynamique d instances newinstance(...) USTL http://www.lifl.fr/ routier 4

Class:forName() Extension dynamique et réflexion public static Class forname(string classname) throws ClassNotFoundException Class:newInstance() public Object newinstance() throws InstantiationException, IllegalAccessException USTL http://www.lifl.fr/ routier 5

package essais.dynamic; interface Bidule { public void doit(); class Truc implements Bidule { public void doit() { System.out.println("bidule truc"); class Machin implements Bidule { public void doit() { System.out.println("bidule machin"); public class TestForName { public static void main(string[] args) throws ClassNotFoundException,IllegalAccessException, InstantiationException { Class c = Class.forName("essais.dynamic."+args[0]); Bidule b = (Bidule) c.newinstance(); b.doit(); // TestForName +----------------------------------------- java TestForName Truc --> bidule truc java TestForName Machin --> bidule machin USTL http://www.lifl.fr/ routier 6

Introspection et Réflexion Informations récupérables : nom de classe (type) (getname()) super classe (getsuperclass()) paquetage (getpackage()) (objet Package) modificateurs de classes (public, abstract) (getmodifiers()) le nom des interfaces implémentées (getinterfaces()) les attributs (get[declared]field[s]()) objet Field : nom, type, modificateur les constructeurs ( get[declared]constructor[s]()) objet Constructor les méthodes (get[declared]method[s]()) objet Method : nom, type de retour, type args, exception, modificateurs,... isinstance(object), isassignablefrom(class), isinterface USTL http://www.lifl.fr/ routier 7

Actions créer une instance (newinstance() ou utiliser les constructeurs : Constructor : newinstance(object[]) récupérer une valeur d attribut : Field : get(object) invoquer une méthode : Method : invoke(object, Object[]) instanceof Applications RMI USTL http://www.lifl.fr/ routier 8

Création d un instance package counter; public class testcounter { public static void main(string[] args) throws ClassNotFoundException,IllegalAccessException, InstantiationException { Class counterclass = Class.forName("counter."+args[0]); Class[] paramsclasses = new Class[] { Object[] params = new Object[] { if (args.length == 2) { paramclasses = new Class[] { java.lang.integer params = new Object[] { new Integer(args[1]) Constructor construct = counterclass.getconstructor(paramclasses); Counter acounter = (Counter) construct.newinstance(params); new GraphicalCounter(aCounter); USTL http://www.lifl.fr/ routier 9

Invoquer une méthode import java.lang.reflect.method; Class c =... Method meth = c.getmethod(nom méthode, new Class[] { classes des paramètres ); Object result = meth.invoke(obj, new Object[]{ les paramètres ); // obj est une référence vers une instance de type c // Object result = seulement si méthode avec résultat... le paramètre obj est ignoré si la méthode est statique IllegalAccessException,IllegalArgumentException, InvocationTargetException ArrayList list = new ArrayList(); Class c = list.getclass(); Method meth = c.getmethod("add", new Class[] { Object.class ); meth.invoke(list, new Object[]{"premier"); +------------ System.out.println(list.size()+" -> "+list.get(0)); 1->premier USTL http://www.lifl.fr/ routier 10

Accéder à un attribut import java.lang.reflect.field; Class c =... Field attribut = c.getfield(nom attribut); Object value = attribut.get(obj); // obj est une référence vers une instance de type c // getint(object), getboolean(object), etc. existent pour attribut // à valeur dans types primitifs int, boolean, etc. le paramètre obj est ignoré si la méthode est statique IllegalArgumentException, IllegalAccessException Livre sda = new Livre("Le seigneur des Anneaux"); Class c = Livre.class; Field attribut = c.getfield("title"); Object value = attribut.get(sda); // si accessible! +------------ System.out.println("-> "+value); -> Le Seigneur des Anneaux USTL http://www.lifl.fr/ routier 11

Fichier avec information de typage pour faciliter l écriture de Factory (peut imposer convention de nommage) : Quel est le nom de l auteur du Seigneur des Anneaux? Symbolic Tolkien 1 Frodo est un Hobbit? YesNo vrai 1 Combien de membres composent la Compagnie de l Anneau? Numeric 9 2 public Question litetcreequestion() { String text = in.readline(); String typequestion = in.readline(); String reponse = in.readline(); Integer nbpoints = new Integer(in.readLine()); Class c = class.forname(typequestion+"question"); Constructor constructor = c.getconstructor(new Class[] { String.class, String.class, Integer.class); Question q = (Question) constructor.newinstance( new Object[] { text, reponse,nbpoints); return q; USTL http://www.lifl.fr/ routier 12

Class c = class.forname("yesnoquestion"); Constructor constructor = c.getconstructor(new Class[] { String.class, String.class, Integer.class); Question q = (Question) constructor.newinstance({ "texte question","vrai", new Integer(1)); Method mgetquestion = c.getmethod("getquestion",new Class[]{); String qtostring = (String) mgetquestion.invoke(q, new Object[] {); System.out.println(qToString); Method msetanswer = c.getmethod("setanswer",new Class[]{String.class); msetanswer.invoke(q, new Object[] {"vrai"); Method miscorrect = c.getmethod("iscorrect",new Class[]{); Boolean result = msetanswer.invoke(q, new Object[] {); System.out.println(result); équivaut à : Question q = new YesNoQuestion("texte question","vrai", 1); String qtostring = q.getquestion(); System.out.println(qToString); q.setanswer("vrai"); boolean result = q.iscorrect(); System.out.println(result); USTL http://www.lifl.fr/ routier 13

interface Shape { void draw(); void erase(); abstract class ShapeFactory { protected abstract Shape create(); static Map factories = new HashMap(); // A Template Method: public static final Shape createshape(string id) throws BadShapeCreation { if(!factories.containskey(id)) { try { Class.forName(id); // charge dynamiquement catch(classnotfoundexception e) { throw new BadShapeCreation(id); // regarde si on l a ajouté: if(!factories.containskey(id)) throw new BadShapeCreation(id); return ((ShapeFactory)factories.get(id)).create(); class Circle implements Shape { private Circle() { public void draw() { System.out.println("Circle.draw"); public void erase() { System.out.println("Circle.erase"); private static class Factory extends ShapeFactory { protected Shape create() { return new Circle(); static { ShapeFactory.factories.put("Circle", new Circle.Factory()); USTL http://www.lifl.fr/ routier 14

Class Loader Chaque classe utilisée par un programe Java doit être chargée dans la JVM class loader primaire accompli par les class loaders (ou système) est propre à chaque JVM un seul par JVM objets ClassLoader est propre à l application, donc au concepteur de l application autant que le veut le concepteur USTL http://www.lifl.fr/ routier 15

Espaces de nommage Dans un JVM, chaque classloader possède son propre espace de nommage. espace de nommage = ensemble des noms (qualifiés) des classes chargées À l intérieur d un espace de nommage chaque nom est unique une même application peut avoir deux espaces de nommage qui contiennent des noms identiques (mais chargés par des class loaders dfférents) et ne correspondent pas forcément aux mêmes classes. USTL http://www.lifl.fr/ routier 16

Incursion dans la JVM Quand la JVM charge un type (classe ou interface) : l information concernant ce type est extraite d un fichier de classe cette information est rangée dans la zone de méthodes un nom complet est ajouté dans l espace de nommage tout nom de l espace de nommage est associé avec des données dans la zone de méthodes USTL http://www.lifl.fr/ routier 17

Edition de liens dynamique Les fichiers compilés (.class) contiennent des références symboliques sur les autres types dans le pool de constantes. À l exécution, la JVM réalise dynamiquement l édition de liens lors de la phase de résolution de constantes en liant les symboles du pool de constantes. soit le symbole à résoudre (= nom) est déjà dans l espace de nommage soit ce n est pas le cas et il faut charger le type et donc choisir un class loader. Règle de référencement la JVM charge une classe référencée avec le même classe loader que la classe qui provoque la référence USTL http://www.lifl.fr/ routier 18

Class Loader Création d espaces de nommage distincts éviter des conflits de noms (cf. plusieurs applets ds 1 seul navigateur) sécurité (protection entre les espaces de nommage) Contrôle du chargement des classes chargement via le réseau. contrôle pour remplacer dynamiquement une classe déjà chargée mise à jour dynamique de versions de classe sans arrêt de la JVM USTL http://www.lifl.fr/ routier 19

Utilisation de Class Loader package essais.dynamic; import java.io.*; class UneClasse {... class MyClassLoader extends ClassLoader { public Class loadclass(string classname) throws ClassNotFoundException { Class result = findloadedclass(classname); // déjà chargée par ce classloader? if (result!= null) { return result; // si java.* alors utilise le class loader système if (classname.startswith("java.")) { result = super.findsystemclass(classname); if (result!= null) { return result; byte[] data = getdata(classname); if (data == null) { throw new ClassNotFoundException(); result = defineclass(classname, data, 0,data.length); if (result == null) { throw new ClassNotFoundException(); return result; USTL http://www.lifl.fr/ routier 20

private byte[] getdata(string classname) { FileInputStream file; String filename = classname.replace(.,file.separatorchar)+".class"; try { file = new FileInputStream(fileName); catch(filenotfoundexception e) { return null; BufferedInputStream bis = new BufferedInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream(); try { int c = bis.read(); while (c!= -1) { out.write(c); c = bis.read(); catch (IOException e) { return null; return out.tobytearray(); // MyClassLoader public class TestCastClassLoader { public static void main (String[] args) throws Exception { Class c = Class.forName("essais.dynamic.UneClasse"); MyClassLoader myloader = new MyClassLoader(); Class autrec = myloader.loadclass("essais.dynamic.uneclasse"); System.out.println("comparaison de classe "+autrec.equals(c)); // TestCastClassLoader java TestCastClassLoader --> false USTL http://www.lifl.fr/ routier 21