´ Reflexion ´ Reflexion en Java Guillaume Wisniewski [email protected] LIMSI — Universite´ P11 ocobre 2009 ´ redacteur : Paoli Gabriel et Guiot Florent ´ ´ La reflexion est la capacite´ d’un programme a` examiner, et eventuellement a` modifier, ses structures internes de haut niveau (par exemple ses objets) ´ lors de son execution. G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 1 G. Wisniewski (LIMSI — Universite´ P11) / 14 Un peu de vocabulaire... ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 2 Exemple d’introspection (en python) ´ introspection capacite´ d’un programme a` examiner son propre etat. (possible en java) ´ intercession capacite´ d’un programme a` modifier son propre etat ´ ´ ´ d’execution ou d’alterer sa propre interpretation ou signification. (pas possible en java) G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ Reflexion en Java Exemple d’intercession (en python) >>> a = "bonjour" >>> dir(a) [’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’, ’__ge__’, ’__getattribute__’, ’__getitem__’, ’__getnewargs__’, ’__getslice__’, ’__gt__’, ’__hash__’, ’__init__’, ’__le__’, ’__len__’, ’__lt__’, ’__mod__’, ’__mul__’, ’__ne__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__rmod__’, ’__rmul__’, ’__setattr__’, ’__str__’, ’capitalize’, ’center’, ’count’, ’decode’, ’encode’, ’endswith’, ’expandtabs’, ’find’, ’index’, ’isalnum’, ’isalpha’, ’isdigit’, ’islower’, ’isspace’, ’istitle’, ’isupper’, ’join’, ’ljust’, ’lower’, ’lstrip’, ’partition’, ’replace’, ’rfind’, ’rindex’, ’rjust’, ’rpartition’, ’rsplit’, ’rstrip’, ’split’, ’splitlines’, ’startswith’, ’strip’, ’swapcase’, ’title’, ’translate’, ’upper’, ’zfill’] ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 3 / 14 G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 4 ` quoi c¸a sert ? A Aide a` la programmation >>> class A: ... def hello(self): ... print "hello" ... >>> A().hello() hello >>> def hello2(self): ... print "hello guillaume" ... >>> A.hello = hello2 >>> A().hello() hello guillaume debogage / profiling ´ completion automatique / aide ´ chargement / execution du code par la jvm JIT compilation ´ eraux ´ Programme plus gen plugins ´ meta-programmation code auto-modifiant (p.ex. charger un fichier par ftp ou http) G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 5 / 14 G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 6 ` Plus concretement : calculatrice SDC Classe Factory I package sdc; Objectifs pouvoir ajouter facilement de nouvelles commandes ` c.-a-d. : pouvoir les reconnaˆıtre (analyse syntaxique) ´ pouvoir executer le code correspondant import java.lang.reflect.*; import java.util.ArrayList; import java.util.List; public class Factory { private ArrayList<String> list; En pratique 1 ´ ˆ une classe par commande ⊕ analyse et execution dans une meme classe 2 ´ autant d’instance qu’il y a de commandes a` difficulte´ : il faut creer ´ ´ executer ⇒ creation dynamique public Factory() { this.list = new ArrayList<String>(); // add all types or operation here this.list.add("IntegerValue"); this.list.add("QuitSymbol"); this.list.add("ClearSymbol"); this.list.add("ViewSymbol"); G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 7 / 14 G. Wisniewski (LIMSI — Universite´ P11) Classe Factory II ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 8 Classe Factory III this.list.add("AddOperation"); this.list.add("SubOperation"); this.list.add("DivOperation"); this.list.add("MulOperation"); private Symbol createInstance(String className) throws InternalError { try { Class cl = Class.forName(className); java.lang.reflect.Constructor co = cl.getConstructor(); return (Symbol) co.newInstance(); } catch (Exception e) { throw new InternalError(); } } } public Symbol[] registered() throws InternalError { List<Symbol> s = new ArrayList<Symbol>(); for (String objectName : this.list) { objectName = "sdc." + objectName; s.add(this.createInstance(objectName)); } } return s.toArray(new Symbol[this.list.size()]); } G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 9 / 14 G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 1 ` Comment connaˆıtre l’ensemble des classes meres ? ´ Heritage Class c = Class.forName("maClasse"); while((c = c.getSuperclass()) != null) { System.out.println(c.getName()); } ` partie I Premiere Le paquetage java.lang.reflect Interface Class c = Class.forName("maClasse"); Class[] interfaces = c.getInterfaces(); for(Class interface : c.getInterfaces()) { System.out.println(interface.getName()); } G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 11 G. Wisniewski (LIMSI — Universite´ P11) / 14 ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 1 ´ Methodes ´ ´ Comment lancer dynamiquement une methode donnee d’un objet ? ´ ´ ´ Comment recup erer la liste des methodes d’une classe ? Class c = Class.forName("maClasse"); java.lang.reflect.Method[] m = c.getMethods(); ´ Comment connaˆıtre la signature d’une methode ? // m est un objet de type Method Class r = m.getReturnType(); Class[] params = m.getParameterTypes(); G. Wisniewski (LIMSI — Universite´ P11) ´ Reflexion en Java Object run(Object obj, Object[] args, String meth) throws Exception { Class[] paramTypes = null; if(args != null) { paramTypes = new Class[args.length]; for(int i = 0; i < args.length; ++i) { paramTypes[i] = args[i].getClass(); } } Method m = obj.getClass().getMethod(meth, paramTypes); return m.invoke(obj, args); } ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent 13 G. Wisniewski (LIMSI — Universite´ P11) / 14 ´ Reflexion en Java ´ ocobre 2009 redacteur : Paoli Gabriel et Guiot Florent / 14 1
© Copyright 2024 ExpyDoc