Cours 2 Architectures logicielles dynamiquement adaptables

Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
ALASCA — Architecture logicielles avancées
pour les systèmes complexes auto-adaptables
c
2014–2017 Jacques Malenfant
Master informatique, spécialité STL – UFR 919 Ingénierie
Université Pierre et Marie Curie
1 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Cours 2
Architectures logicielles
dynamiquement adaptables
2 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Objectifs pédagogiques du cours 2
Introduire la notion de réflexivité logicielle pour répondre à une
partie du cahier des charges de la fonction d’auto-adaptabilité.
Comprendre et apprendre à utiliser la réflexivité structurelle de
Java pour réaliser des opérations d’adaptation dynamique.
Introduire la notion de réflexivité comportementale et sa
déclinaison en Java.
Comprendre et apprendre à utiliser la réflexivité comportementale
de Java pour réaliser des opérations d’adaptation dynamique.
Comprendre et apprendre à utiliser la réflexivité architecturale
dans les modèles à composants comme BCM pour réaliser des
opérations d’adaptation dynamique.
3 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Plan
1Adaptabilité logicielle
2Réflexivité structurelle en Java
3Exemple : connecteur de composants par proxy
4Réflexivité comportementale en Java et Javassist
5Exemple : connecteur généré avec Javassist
6Réflexivité en BCM
4 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Mécanismes pour l’adaptabilité dynamique (rappel) I
Pour un système informatique, l’adaptation peut se décliner en
quatre grandes familles de mécanismes :
1paramétriques : changement de paramètres de configuration
n’impliquant pas un impact significatif sur les ressources
consommées ni sur celles nécessaires pour l’adaptation.
Exemples : taille de tampons bornés, nombre de threads, etc.
2ressources : changement dans la quantité de ressources mises à
la disposition de l’entité ayant un impact significatif à la fois sur la
QdS et sur le coût d’opération.
Exemples : allocation de machines virtuelles dans un centre de
calcul, variation de la fréquence de processeurs, etc.
3fonctionnelles : modification au contenu des programmes
entraînant un changement dans ses fonctionnalités et la QdS
associée.
Exemples : ajout/retrait/modification de code, recompilation et
optimisation de code, etc.
5 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Mécanismes pour l’adaptabilité dynamique (rappel) II
4architecturaux : modification à la structure des programmes
entraînant aussi un changement dans ses fonctionnalités et la
QdS associée, et pouvant demander de longs délais pour être
réalisées dans le cas des systèmes répartis.
Exemples : remplacement de bibliothèques dynamiques,
modification de l’assemblage de composants, déconnexion et
reconnexion dynamique de services web, etc.
Familles qui ont un recouvrement entre elles, et donc des
frontières floues.
Caractéristiques essentielles : impact sur la difficulté de réaliser
les adaptations, leur coût, les contraintes qu’elles imposent, la
prédictibilité de leurs effets.
6 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Classes et portée des mécanismes I
Outre les familles, on peut considérer un autre axe de
classification des mécanismes d’adaptation :
les opérations élémentaires, insécables et non-interruptibles,
comme la modification d’un paramètre, l’allocation d’une quantité
donnée d’une ressource monolithique ;
les opérations composites classiques : séquentielles,
conditionnelles, répétitives, etc.
les opérations composites temporisées et réparties, comme des
plans exécutés sur différentes entités, déployées sur différents
ordinateurs et l’expression de leurs dépendances temporelles,
temporisées et fonctionnelles ;
les opérations coordonnées, à petite, moyenne et grande échelle
nécessitant des mécanismes de propagation, de synchronisation
et de gestion des dépendences de types vagues de mises à jour
et front d’adaptation dans un réseau à grande échelle, par
exemple.
7 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Classes et portée des mécanismes II
Comme le suggère la nomenclature précédente, la description et
l’exécution d’adaptations à tout ou partie d’un programme,
éventuellement réparti, est lourde et suggère des langages et de
moteur d’exécution dédiés à ces opérations (DSL...).
Nous allons maintenant nous concentrer sur certaines opérations
élémentaires d’adaptations fonctionnelles et architecturales qui
ont été développées depuis une trentaine d’années dans le
domaine des langages de programmation et des modèles à
composants.
8 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Architectures réflexives et programmation
Concept lié à la modification dynamique des programmes, une
pratique aussi ancienne que l’informatique elle-même.
Conceptualisée en tant que discipline par Brian Smith au début
des années 1980.
Exemple : réflexion en Java
Java définit une grande partie des éléments constitutifs d’un
programme sous la forme d’objets, comme les classes, les
méthodes, etc. (java.lang.reflect).
Java prévoit le chargement dynamique de code ainsi que des
moyens pour récupérer et remplacer le code (classes) chargé
dans sa machine virtuelle (java.lang.instrumentation).
Des bibliothèques externes permettent de modifier
dynamiquement le code compilé des classes (Javassist).
Bien que relativement élémentaires, Java offre des moyens
standardisés pour observer des informations sur l’exécution des
programmes (java.lang.management et JMX).
9 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Réflexion et architectures à base de composants
Des modèles de composants, comme BCM et Fractal, prévoient
des interfaces d’introspection et d’intro-action permettant de
découvrir et modifier les interfaces requises et offertes par les
composants, les interconnexions entre composants, ainsi que
d’autres informations sur l’achitecture de l’application.
La réflexion dans une architecture à base de composants doit
donc permettre de modifier cette architecture dynamiquement, en
ajoutant, retranchant et remplaçant des composants pendant
l’exécution, pour adapter un système à base de composants à
son état d’exécution courant.
10 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Plan
1Adaptabilité logicielle
2Réflexivité structurelle en Java
3Exemple : connecteur de composants par proxy
4Réflexivité comportementale en Java et Javassist
5Exemple : connecteur généré avec Javassist
6Réflexivité en BCM
11 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Réifier = décrire + accéder
Le langage Java possède une API pour la réflexion structurelle
fournie par les classes Object et Class de même que le
paquetage java.lang.reflect, que nous allons maintenant
rapidement découvrir.
Pour réifier des entités, il faut d’abord les décrire, ou en donner
une représentation : c’est le rôle des classes !
Mais pour avoir accès à la description des objets, il faut pouvoir
manipuler dynamiquement les classes elle-mêmes.
)Comment faire ?
)représenter les classes comme des objets.
)mais alors, quelle sera la classe qui va décrire ces
objets qui sont en réalité des classes ?
Métaclasse : classe dont les instances (objets) sont des classes.
Concept introduit en Smalltalk (1976), puis étudié par Cointe et
Briot (1984-87) dont le problème de clôture de la régression
potentiellement infinie.
12 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
La métaclasse java.lang.Class<T>
C’est la pseudo-métaclasse1unique de tous les objets
représentant des classes en Java, donc la méta-métaclasse de
toutes les classes.
La variable de type Treprésente le type des objets instances de
cette classe, donc la classe elle-même.
Exemple : Class<Point> = métaclasse de Point.
C’est une classe finale, donc non-héritable.
Tous les objets « classes » sont ainsi des « instances » de
l’unique « pseudo-métaclasse » : java.lang.Class<T>.
)pas de nouvelles formes de métaclasses.
)pas de modification de la réprésentation ou du
comportement des classes.
Exemple : classes singleton qui connaissent leur unique instance.
1C’est-à-dire, pas une métaclasse de plein droit car non-remplaçable et non-extensible.
13 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Trois façons de récupérer un objet classe
Par la méthode getClass de la classe Object :
Point p = new Point(0.0, 0.0) ;
Class<Point> point = p.getClass() ;
Par la méthode statique forName de la classe Class :
Class<?> maClasse ;
try {
maClasse = Class.forName("Point") ;
} catch(ClassNotFoundException e) {
System.out.println("La classe Point n’existe pas.") ;
throw e ;
}
Par la variable statique class associée à chaque classe :
Class<Point> uneAutreReferenceSurPoint = Point.class ;
14 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Principales méthodes de java.lang.Class<T> I
<A extends Annotation> getAnnotation(Class<A> annotationClass) Returns this
element’s annotation for the specified type if such an annotation is present,
else null.
ClassLoader getClassLoader() :Returns the class loader for the class.
Constructor<T> getConstructor(Class... parameterTypes) :Returns a Constructor
object that reflects the specified public constructor of the class represented
by this Class object.
Constructor[] getConstructors() :Returns an array containing Constructor objects
reflecting all the public constructors of the class represented by this Class
object.
Constructor getDeclaredConstructor(Class... parameterTypes) :Returns a
Constructor object that reflects the specified constructor of the class or
interface represented by this Class object.
Constructor[] getDeclaredConstructors() :Returns an array of Constructor objects
reflecting all the constructors declared by the class represented by this Class
object.
Field getDeclaredField(String name) :Returns a Field object that reflects the specified
declared field of the class or interface represented by this Class object.
15 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Principales méthodes de java.lang.Class<T> II
Field[] getDeclaredFields() :Returns an array of Field objects reflecting all the fields
declared by the class or interface represented by this Class object.
Method getDeclaredMethod(String name, Class... parameterTypes) :Returns a
Method object that reflects the specified declared method of the class or
interface represented by this Class object.
Method[] getDeclaredMethods() :Returns an array of Method objects reflecting all the
methods declared by the class or interface represented by this Class object.
Field getField(String name) :Returns a Field object that reflects the specified public
member field of the class or interface represented by this Class object.
Field[] getFields() :Returns an array containing Field objects reflecting all the accessible
public fields of the class or interface represented by this Class object.
Class[] getInterfaces() :Determines the interfaces implemented by the class or interface
represented by this object.
Method getMethod(String name, Class... parameterTypes) :Returns a Method
object that reflects the specified public member method of the class or
interface represented by this Class object.
16 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Principales méthodes de java.lang.Class<T> III
Method[] getMethods() :Returns an array containing Method objects reflecting all the public
member methods of the class or interface represented by this Class object,
including those declared by the class or interface and and those inherited
from superclasses and superinterfaces.
String getName() :Returns the name of the entity (class, interface, array class, primitive
type, or void) represented by this Class object, as a String.
Class<? super T> getSuperclass() :Returns the Class representing the superclass of
the entity (class, interface, primitive type or void) represented by this Class.
boolean isAssignableFrom(Class<?> cls) :Determines if the class or interface
represented by this Class object is either the same as, or is a superclass or
superinterface of, the class or interface represented by the specified Class
parameter.
T newInstance() :Creates a new instance of the class represented by this Class object.
17 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
Le « package » java.lang.reflect
java.lang.Object
java.lang.reflect.AccessibleObject (implements java.lang.reflect.AnnotatedElement)
java.lang.reflect.Constructor<T> (implements java.lang.reflect.GenericDeclaration,
java.lang.reflect.Member)
java.lang.reflect.Field (implements java.lang.reflect.Member)
java.lang.reflect.Method (implements java.lang.reflect.GenericDeclaration,
java.lang.reflect.Member)
java.lang.reflect.Array
java.lang.reflect.Modifier
java.security.Permission (implements java.security.Guard, java.io.Serializable)
java.security.BasicPermission (implements java.io.Serializable)
java.lang.reflect.ReflectPermission
java.lang.reflect.Proxy (implements java.io.Serializable)
java.lang.Throwable (implements java.io.Serializable)
java.lang.Error
java.lang.LinkageError
java.lang.ClassFormatError
java.lang.reflect.GenericSignatureFormatError
java.lang.Exception
java.lang.reflect.InvocationTargetException
java.lang.RuntimeException
java.lang.reflect.MalformedParameterizedTypeException
java.lang.reflect.UndeclaredThrowableException
18 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
La classe java.lang.reflect.Field I
Classe finale dont les instances représentent les champs.
Champs : variables, constantes.
Peuvent être de classe (statiques) ou d’instance.
Principales méthodes :
Object get(Object obj) :Returns the value of the field represented by this Field, on the
specified object.
<T extends Annotation> getAnnotation(Class<T> annotationClass) :Returns this
element’s annotation for the specified type if such an annotation is present,
else null.
Class<?> getDeclaringClass() :Returns the Class object representing the class or
interface that declares the field represented by this Field object.
int getModifiers() :Returns the Java language modifiers for the field represented by this
Field object, as an integer.
19 / 60
Adapt. logicielle Réfl. structurelle Connecteur proxy Réfl. comportementale Connecteur Javassist Réflexivité en BCM
La classe java.lang.reflect.Field II
String getName() :Returns the name of the field represented by this Field object.
Class<?> getType() :Returns a Class object that identifies the declared type for the field
represented by this Field object.
void set(Object obj, Object value) :Sets the field represented by this Field object on
the specified object argument to the specified new value.
20 / 60
1 / 15 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !