Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Séances 4, 5, 6
Laurent Henocque
http://laurent.henocque.free.fr/
Enseignant Chercheur ESIL/INFO France
http://laurent.henocque.perso.esil.univmed.fr/
mis à jour en Septembre 2009
Licence Creative
Commons
http://creativecommons.org/licenses/by-sa/2.0/fr/
• dynamique
• adapté à un environnement évolutif
• interprété
• lié aux design patterns par essence:
• itérateurs, objets fonction, inversion de
contrôle etc...
Performance
...
Déclaration
Throwable
Error Exception
AssertionError
• fillInStackTrace,
• getLocalizedMessage,
• getMessage,
• getStackTrace,
• initCause, getCause,
• setStackTrace, printStackTrace
Interception
• Après un bloc try, avec passage ou non
dans le premier gestionnaire catch
compatible avec le type de l’exception,
exécution de la clause finally
…
try
{ … }
catch (type-exception1 v1)
{ … }
catch (type-exception2 v2)
{ … }
…
finally
{
// on passe nécessairement par ici
...
}
Lancement d'exception
• Invariants de classe
• Pré conditions
• Post conditions
• Invariants d’étape d’algorithme
• Variants de boucle
• Invariants de configuration,
d’architecture etc...
Invariants de Classe
Class Stack {
int arraySize;
int top;
boolean invariant(){
assert top>=0;
assert top<=size;
return true;
}
void push(int i){
assert invariant() ;
... // le code
assert invariant() ;
}
}
Interface “Checked"
Class Stack {
int arraySize;
int top;
boolean invariant(){...}
void getValueAtPos(int i){
assert invariant();
assert i>=0; //séparés exprès
assert i<top; //séparés exprès
... // le code
}
}
Post conditions / Delta
Conditions
Class Stack {
int arraySize;
int top;
boolean invariant(){...}
void push(int i){
assert invariant();
int auxTop=top;
... // le code
assert top=auxTop+1;
assert invariant();
}
}
Invariants d’étape
d’Algorithme
int lastLoopVar=10000;
int loopVar=20;
while (1){
assert lastLoopVar>loopVar;
if(loopVar==0)break;
// (garantit la terminaison)
...
lastLoopVar=loopVar--;
}!
Processus de
développement
L’écriture d’un programme devrait se faire
selon le processus suivant:
1) définition des classes et interfaces de
programmation
2) écriture d’un programme de test
3) définition des structures de données
4) écriture des invariants, pré, post conditions
5) codage
Quelques Avantages de
l’Utilisation d’Assert
• Les invariants constituent une documentation
toujours exacte
• On sépare le contenu algorithmique de la
vérification de ses conditions d’utilisation
• On se prémunit d’avance contre les bugs de
régression, lors de modifications d’une classe
• On détecte les conditions logiques des erreurs
au plus tôt, alors que leurs conséquences
peuvent se manifester en des lieux inopportuns.
Introspection
Les classes
• La classe est l’élément de base de Java.
Tout est classe sauf les types primitifs
(int, float, double, ...) et les tableaux
• Il n’y a pas de fonctions, seulement des
méthodes
• Toutes les classes dérivent d'une
superclasse commune java.lang.Object
• “Object” fournit un grand nombre de
services
La classe Object
API fondamentale
• protected Object clone()
– crée et retourne une copie de l'objet. Remplace l’opérateur d’affectation copie (=)
• Class getClass()
– renvoie la classe d'un objet
• int hashCode() !
– renvoie la clé de hash code associée à l'objet
• String toString()
– retourne une chaîne de caractère. Utilisée par la jvm pour toutes les conversions en
chaînes
La classe Object
API - Threads
• Package getPackage()
– le package
• int getModifiers()
– un int contenant des booléens pour public, static etc...
• Class getSuperclass()
– la superclasse
• Class[] getInterfaces()
– retourne les interfaces implantées par la classe
API de Class
Classes Imbriquées
• Class[] getClasses()
– tableau de toutes les classes et interfaces publiques membres de cette classe
• Class[] getDeclaredClasses()
– tableau de toutes les classes et interfaces membres.
• Class getDeclaringClass()
– retourne la classe dont on est membre (éventuellement)
API de Class
Informations de Type
• boolean isAssignableFrom(Class cls)
– est ce que cls est une sous classe?
• boolean isInterface()
– interface?.
• boolean isPrimitive()
– type primitif? (int, void, etc...)
• boolean isArray()
– un tableau?
• Class getComponentType()
– le type des composants d'un "array".
API de Class
Accès aux constructeurs
• Constructor[] getConstructors()
• Constructor[] getDeclaredConstructors()
– retournent les constructeurs publics, ou déclarés
• Object newInstance()
– crée une nouvelle instance avec le constructeur sans arguments
Accès aux membres
• Field getDeclaredField(String name)
• Field[] getDeclaredFields()
• Field[] getFields()
– retournent les champs de la classe publics ou non
• Method[] getDeclaredMethods()
• Method[] getMethods()
– retournent les méthodes
Sécurité, ressources
• ClassLoader getClassLoader()
– le chargeur de cette classe.
• ProtectionDomain getProtectionDomain()
– les permissions accordées à cette classe
• Object[] getSigners()
– renvoie les "signers" de la classe - certificats d'authenticité-.
• boolean desiredAssertionStatus()
– renvoie le statut par défaut pour assert de la classe (les assertions peuvent
être contrôlées sur une base "classe par classe")
Contructeurs, champs,
méthodes
• Les classes Constructor, Field et Method offrent
une API permettant d’analyser un constructeur, un
champ ou une méthode.
• Types des paramètres d’une fonction
• Type de la valeur de retour
• Type d’un attribut
• Appel de la méthode ou avec des paramètres
appropriés
• Création d’une instance avec des paramètres
appropriés
Pointeurs de
Fonctions
Et classes anonymes
Pointeurs de fonctions
• Java ne permet pas de manipuler
explicitement de pointeur de fonction.
• Le seul moyen d’utiliser ces pointeurs se
fait via l’appel de méthodes, qui sont
toujours virtuelles en Java.
class Demon {
public abstract void
execute(/*params*/);
}
Pointeurs de fonctions
abstract class A {
abstract void g();
}
class Z {
void h(A a){ ... a.g(); ...}
}
...
{
Z z=new Z();
z.h(new A(){ void g(){ ... }});
}
Threads
Section Minimale d’introduction aux API
des Threads en vue du cours d’IHM
Les threads
ThreadGroup getThreadGroup();
• Mauvaise idée:
Le type "Wildcard"
• Il faut utiliser:
public void drawAll(
List<? extends Shape> shapes)
{ ... }
Méthodes Génériques
• Il faut écrire:
Wildcard OU Générique ?
• VS:
Wildcard ET générique?
AbstractSequentialList<E> Vector<E>
ArrayList<E>
LinkedList<E> Stack<E>
HashSet<E> TreeSet<E>
LinkedHashSet<E>
HashMap<E> TreeMap<E>
WeakHashMapMap<E>
LinkedHashMap<E>
IdentityHashMap<E>
• boolean add(E e)
• boolean remove(E e)
• boolean contains(Object o)
• boolean isEmpty()
• int size()
Api des Séquences
• E get (int i)
• E set (int i, E e)
• void add (int i, E e)
• E remove (int i)
Classe Stack<E>
• E push(E e) // empile e en sommet de pile
• E pop() // dépile le sommet de pile
API des Ensembles
PhantomReference(T!referent,
ReferenceQueue<? super T>!q)
• Crée une nouvelle référence fantôme sur
“referent”)
• La queue est obligatoire
• La fonction “get” renvoie toujours “null”
SoftReference<T>
WeakReference<T>
• SoftReference(T!referent)
• SoftReference(T!referent,
ReferenceQueue<? super T>!q)
• WeakReference(T!referent)
• WeakReference(T!referent,
ReferenceQueue<? super T>!q)
java.lang.ref
ReferenceQueue<T>
• ReferenceQueue()
• Reference <? extends T> poll()
• Reference<? extends T> remove()
• Reference<? extends T> remove (long!t)
• Removes the next reference object in this
queue, blocking until either one becomes
available or the given timeout period
expires.
Listing C:
MyReference.java
import java.lang.ref.*;
import java.lang.ref.*;
import java.util.*;
http://articles.techrepublic.com.com/5100-10878_11-1049546.html#
Listing D:
WebCache.java
import java.io.*;
import java.net.*;
import java.util.*;
• (d'après http://www-128.ibm.com/developerworks/java/library/j-
jtp11225/)
Comportement du GC et
utilisation de mémoire
• (d'après http://www-128.ibm.com/developerworks/java/library/j-
jtp11225/)
Exemple de source
• Annotations simples:
– Override
– Deprecated
– SuppressWarnings
• Méta annotations
– Target
– Retention
– Documented
– Inherited
Override
• @Target(ElementType.ANNOTATION_TYPE)
• Indique que le type déclaré est une méta annotation (donc
une annotation d’annotations. Par exemple:
@Target(ElementType.ANNOTATION_TYPE)
public @interface MetaAnnotationType
{ ... }
Utilisation des tableaux
@Target(ElementType.METHOD)
public @interface Test_Target {
public String do();
}
• Utilisation correcte:
@Test_Target("glop")
public void methode1() {...}
Retention
• (Sauf héritées).
boolean isAnnotationPresent(Class< ? extends
Annotation>)
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Todo {
String[] description();
}
Cette classe liste ses
annotations
import ...;
@Todo(description = {"Modifier cette classe",”avant l’hiver”})
public class TestAnnotation {
!!public static void main(String[] args) {
!!!!Todo todo = null;
!!
!!!// traitement annotation sur la classe
!!!!Class classe = this.class;
!!!!todo = classe.getAnnotation(Todo.class);
!!!!if (todo != null) {
!!!!!!System.out.println("classe "+ classe.getName());
!!!!!!for(String desc : todo.description()) {
!!!!!!!!System.out.println("!!!! _ "+desc);
!!!!!!}!!!!
}
} // d’après http://www.jmdoudoux.fr/java/dej/chap010.htm
annotations traitées à la
compilation
Java 6 intègre la déclaration de processeurs d’application au
compilateur javac
• -processor
• -proc
• -processorpath
• -A (options aux processeurs d'annotations cle=valeur)
• -XprintRounds
(informations sur le traitement des annotations)
• -XprintProcessorInfo
liste les annotations traitées
Passes (Rounds)
• http://www-sor.inria.fr/~dedieu/java/
• Le langage Java, Touraivane, cours ESIL, Dpt GBMA
• Le polycopié de C. Chaouiya, cours ESIL, Dpt GBMA
• La première version de ce support de cours a été produite par
Marc Daniel, ESIL
• Google : http://www.google.fr/search?q=java