Réflexion en Java Réflexion Un peu de vocabulaire... Exemple d

´
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