![]() |
![]() |
Frédéric Mallet > Programmation Avancée et Patrons de conception - 2010/2011 > TD2 - Chargement dynamique
TD2 - Chargement dynamiqueDe $1Exercice 1) SocketsEcrire une classe abstraite Copieur dont la méthode concrète void transmet() lit sur un flot de type InputStream et copie le contenu sur un flot de type OutputStream. Les flots d'entrée et de sortie seront passés en paramètre du constructeur. Cette classe abstraite doit déclarer et implanter une méthode void finTransmission() qui fermera les flots d'entrée et de sortie après la fin de transmission. Ecrire deux sous-classes de Copieur. La première classe (Emetteur) aura un constructeur qui prend en paramètre un flot d'entrée et une Socket. La transmission copiera le contenu du flot d'entrée sur le flot de sortie de la socket. La deuxième classe (Recepteur) doit copier le contenu du flot d'entrée d'une socket sur le flot de sortie passé en paramètre du constructeur. Il faudra redéfinir la méthode void finTransmission() pour fermer les sockets à la fin de la transmission. Attention à bien propager les exceptions et à ne pas les capturer trop tôt. Ecrire une classe Client qui lit un fichier dont le nom sera donné en paramètre de la ligne de commande. Ce programme tentera de se connecter sur un serveur dont l’adresse IP (ou nom) et le numéro de port seront donnés en paramètre de la ligne de commande en utilisant la classe Emetteur. Exemple d’utilisation : java Client foo.bin localhost 256 Ecrire une classe Serveur qui lors de la construction ouvre une connexion de type ServerSocket sur un port donné en paramètre. Cette classe aura une méthode serveClient(OutputStream os) qui attend un client potentiel et qui lorsqu'un client se connecte utilise la classe Recepteur pour copier l'information en provenance de la socket du client vers le flot de sortie passé en paramètre (os). Cette classe aura également une méthode void close() pour fermer le serveur. Pour tester vos classes, on implantera une classe TestServeur qui créé un serveur, sert un client et dirige le contenu transmis par le client vers un fichier sur le disque. Le nom du fichier destination sera donné en paramètre de la ligne de commande. Exemple d’utilisation : java TestServeur bar.bin Exercice 2 : héritage, composition, interface et chargement dynamiqueCet exercice se déroule en quatre étapes. A partir de maintenant, vous pouvez utiliser un environnement tel Eclipse que certains connaissent déjà. Sinon, vous pouvez consulter un tutorial en ligne (le début jusqu'au chapitre 8, partie 1est suffisant). http://www.jmdoudoux.fr/accueil_java.htm Ou plus simplement continuer comme vous le faisiez pour les deux premières questions. 2.a) création d'une « Fonction ».On veut définir une interface IFonction qui possède une méthode (abstraite) double f(double x). On veut ensuite implémenter cette interface plusieurs fois pour coder les fonctions qui vous passeront par la tête : § Une droite ax+b avec a et b choisit lors de la construction ; § Une sinusoïde a*sin(omega*t + phi) ; § Un cercle ou plutôt un demi-cercle x2 + y2 = r2 ; § … Ecrire une classe AfficheFonction qui affiche les 20 premières valeurs de la IFonction qu’on lui aura donnée. Il s’agit d’une délégation. Le domaine de valeurs pourra être choisi en paramètre du constructeur de la classe AfficheFonction. Ecrire une classe Exo2 qui affiche les 20 premières valeurs des IFonctions disponibles. 2.b) "réutilisation" de l'objet crééOn voudrait que la classe Exo2 ne dépende pas statiquement des types concrets (Droite, Cercle, Sinusoide, …) des IFonctions manipulées. Y a-t-il une solution ? Comment faut-il compiler ? 2.c) Un premier chargement dynamiqueMaintenant, vous allez essayer de faire un peu de chargement dynamique de classe. Pour cela, il faudra utiliser Class.forName(nom_de_classe) qui peut lever les exceptions suivantes : § LinkageError - erreur au chargement -, § ExceptionInInitializerError - erreur à l'initialisation § ClassNotFoundException - la classe n'a pas été trouvée. La méthode newInstance() peut également soulever des exceptions (IllegalAccessException, InstantiationException, ExceptionInInitializerError et SecurityException). Pour mettre en œuvre ce chargement dynamique, votre programme (Exo2b) pourra accepter un paramètre qu'il traitera comme un nom d'une classe qui implémente IFonction. Votre programme devra essayer de charger la classe passée en paramètre et ce quelques secondes (1,5 par exemple) après son lancement. En plus de la charger, votre programme affichera les 20 premières valeurs en utilisant AfficheFonction. Essayer avec vos classes puis celles de vos voisins. De quels fichiers avez-vous besoin ? Où doivent-ils être positionnés ? 2.d) transfertUtiliser l’exercice 1 pour télécharger (à travers une Socket) le .class d’une IFonction et le charger dynamiquement. Il s’agit essentiellement d'utiliser la classe Serveur de l’exercice 1 et de le combiner avec le code de l’exercice 2.c. Attention il faudra écrire le bytecode reçu dans le bon fichier : Nom.class et dans le bon répertoire. Pour connaître le nom de la classe, on utilisera l'introspection de Java. Il faut donc :
Mots clés:
|
Powered by MindTouch Deki Open Source Edition v.8.08 |