
FAQ Langage JavaConsultez toutes les FAQ
Nombre d'auteurs : 42, nombre de questions : 297, derni�re mise � jour : 19 septembre 2017 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur le forum Java de http://java.developpez.com ainsi que l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
3.1. Mots-cl�s (29)
3.2. Concepts du langage (33)
3.3. Nombres (26)
3.4. Bool�ens (6)
3.5. Cha�nes de caract�res (19)
3.6. Tableaux (14)
3.7. Exceptions (10)
3.8. �v�nements (6)
3.9. Beans (6)
- Comment faire un Hello World en Java ?
- Qu'est-ce qu'une instruction ?
- Qu'est-ce qu'un bloc ?
- Qu'est-ce que la port�e ?
- Qu'est-ce qu'un literal ?
- Quels sont les diff�rents types primitifs ?
- Est-il possible d'utiliser un type primitif comme un type objet ?
- Qu'est-ce que la valeur null ?
- Comment tester si une r�f�rence contient null ?
- Comment �crire des commentaires dans le code ?
- Comment placer des commentaires javadoc ou des annotations au niveau du package ?
- Que sont les exceptions ?
- Comment forcer le passage du � Garbage collector � ?
- Comment annuler la construction d'un objet lors de la construction ?
- Comment recharger dynamiquement une classe ?
- Comment afficher la r�f�rence d'un objet red�finissant la m�thode toString() ?
- Comment d�terminer le temps �coul� entre deux points d'un programme ?
- Comment passer un objet en param�tre par r�f�rence ?
Le code suivant vous pr�sente l�impl�mentation du 1er code type pour d�butant qui affiche ��hello world!�� (��Salut le monde�!��) sur la console�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 | package test; public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } } |
Ce code d�crit une classe publique nomm�e Hello.
Cette classe est contenue dans un package nomm� test.
Cette classe contient une m�thode publique statique nomm�e main() qui sert de point d�entr�e � notre programme.
Cette m�thode prend en param�tre un tableau de cha�nes de caract�res not� String[] et nomm� args.
Dans le corps de cette m�thode, nous imprimons la chaine de caract�res ��Hello World!�� sur la console en invoquant la m�thode println() d'un membre public statique out situ� dans une classe nomm�e System (ou plus exactement java.lang.System).
Attention�: � partir de maintenant, la casse des lettres (majuscules/minuscules) est importante.
Pour compiler ce programme�:
- cr�ez-vous un nouveau r�pertoire vide dans lequel vous allez travailler�;
- dans ce r�pertoire de travail, cr�ez un nouveau r�pertoire nomm� test. Le nom de ce r�pertoire doit correspondre exactement � celui du package d�clar� dans l�ent�te de notre classe�;
- dans le r�pertoire test, cr�ez un nouveau fichier texte que vous nommerez Hello.java. Le nom de ce fichier doit correspondre exactement � celui de la classe Hello d�crite dans le code�;
- ouvrez ce fichier dans un �diteur de texte simple quelconque (Vi, Emacs, notepad, etc. �vitez les logiciels de traitement de texte tels que Writer ou Word)�;
- copiez le code ci-dessus dans le fichier�;
- enregistrez le fichier�;
- ouvrez un interpr�teur de commande dans votre r�pertoire de travail�;
- si vous avez correctement configur� votre PATH, vous pouvez directement invoquer le compilateur Java�:
Code console : S�lectionner tout javac test/Hello.java
- si la compilation fonctionne sans accro, un nouveau fichier nomm� Hello.class fera son apparition dans le r�pertoire test.
Une fois les sources compil�es, pour lancer ce programme�:
- ouvrez un interpr�teur de commande dans votre r�pertoire de travail�;
- si vous avez correctement configur� votre PATH, vous pouvez directement invoquer l�interpr�teur Java�:
Code console : S�lectionner tout java test.Hello
- votre programme se lancera et affichera sur la console�:
Code console : S�lectionner tout Hello World!
F�licitations�! Vous venez de compiler, puis de lancer votre tout premier programme �crit en Java.
Vous pouvez bien s�r proc�der de mani�re similaire en cr�ant un nouveau projet dans un IDE tel que NetBeans, Eclipse ou encore IntelliJ IDEA. La proc�dure exacte varie d'IDE en IDE, mais sur le principe cela reste identique�:
- cr�ez un nouveau projet Java vierge (ou Standalone Java Application)�;
- cr�ez un nouveau package nomm� test�;
- dans ce package test, cr�ez une nouvelle classe vierge nomm�e Hello�;
- collez-y le code ci-dessus�;
- enregistrez le fichier�;
- lancez l�ex�cution du projet.
Vous devriez voir le message Hello World! s'afficher dans l��cran ou la palette de sortie de votre projet.
Une instruction (ou statement) permet de d�finir une action que la JVM doit ex�cuter telle qu'effectuer la somme de deux valeurs ou encore imprimer un message sur la console. G�n�ralement, une instruction tient sur une seule ligne et se termine par le s�parateur ; (��point-virgule�� ou semi-colon), mais ce n'est pas toujours le cas. Il existe trois types d'instructions.
D�claration
Une d�claration permet de d�crire une variable, son type, et �ventuellement sa valeur.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 | int unEntier; float unFlottant = 5.5f; String maChaine; Voiture maVoiture; |
Expression
Une expression effectue le plus souvent une action en affectant une valeur dans une variable, ou encore en invoquant une m�thode. Une expression peut elle-m�me avoir un type.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | unEntier++; unFlottant += 8.75f; maChaine = trouverLeDernierAcquereur(); maVoiture = new Voiture(); maVoiture.demarre(); System.out.println("Salut le monde�!"); |
Structure de contr�le
Une structure de contr�le permet de contr�ler le flot du programme, ce qui permet, entre autres, de sauter des blocs d'instructions en effectuant des tests ou encore de r�p�ter un m�me bloc d'instruction un certain nombre de fois. Les structures de contr�le peuvent souvent faire plusieurs lignes et ne pas avoir de terminaison par un ;.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 | if (unEntier < 5) { // Faire quelque chose. [...] } |
Ou�:
Code Java : | S�lectionner tout |
1 2 3 4 | for (int index = 0�; index < 10�; index++) { // Faire quelque chose. [...] } |
Ou encore�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | switch (maChaine) { case "Toto": case "Tata": // Faire quelque chose. [...] break; case "Titi": // Faire quelque chose. [...] break; case "Tutu": default: // Faire quelque chose. [...] } |
Un bloc en Java est une suite de 0 ou plusieurs instructions qui sont plac�es entre {} (accolades ou curly braces).
Comme nous l'avons vu plus haut, certaines structures ouvrent automatiquement des blocs, par exemple, une classe�:
Code Java : | S�lectionner tout |
1 2 3 4 | public class Hello { // Contenu du bloc. [...] } |
Ou une m�thode�:
Code Java : | S�lectionner tout |
1 2 3 4 | public static void main(String[] args) { // Contenu du bloc. [...] } |
Nous verrons par la suite que d'autres structures de contr�les telles que les boucles for, while ou les tests if ou switch d�finissent �galement des blocs. Il est �galement souvent possible de d�finir des blocs � l�int�rieur d'autres blocs bien que leur signification exacte puisse varier suivant la mani�re dont ils sont d�clar�s�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class Hello { // D�finition d'un bloc statique. static { // Contenu du bloc. [...] } // D�finition d'un bloc non statique. { // Contenu du bloc. [...] } public static void main(String[] args) { // Contenu de la m�thode. [...] // D�finition d'un bloc dans une m�thode. { // Contenu du bloc. [...] } // Contenu de la m�thode. [...] } } |
La port�e (ou scope) d�finit l��tendue du code dans lequel vous pouvez utiliser une variable, un membre, une m�thode ou encore une classe apr�s sa d�claration. De mani�re g�n�rale, et sauf cas particulier, une variable, un membre, une m�thode, ou une classe d�clar�s dans un bloc ne sont pas visibles depuis l�ext�rieur de celui-ci. De plus, de mani�re g�n�rale, un sous-bloc peut aussi acc�der aux variables, membres, m�thodes et classes qui sont accessibles ou d�finis dans son bloc parent.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | // Premier bloc. { int a = 5; // Second bloc. { int b = -2; } } // Troisi�me bloc. { int c = 7; } |
Ici, le premier bloc ne voit que la variable a�; la variable b lui est inconnue. Le second bloc peut par contre acc�der aux deux variables, a et b. Mais aucun de ces deux blocs ne peut acc�der � la variable c. De m�me, le troisi�me bloc ne voit ni a, ni b. Depuis l�ext�rieur de ces trois blocs, aucune variable n'est visible.
Note : en cas particulier, on peut citer les modificateurs d�acc�s qui permettent de r�f�rencer, utiliser et d�acc�der aux membres, m�thodes et classes internes d'une classe depuis l�ext�rieur du bloc de code d�fini par la classe.
Un literal repr�sente un type de base du langage Java. Ces types sont les valeurs bool�ennes (boolean), num�riques (byte, short, char, int, long, float et double), le type objet sp�cial repr�sentant les chaines de caract�res (String) et la valeur null qui d�note une r�f�rence vide.
Les types bool�ens et num�riques sont dits ��types primitifs�� par opposition aux r�f�rences qui permettent de manipuler des objets.
-
Literals dans les sp�cifications du langage Java.
Les diff�rents types primitifs du langage Java sont�:
Valeurs bool�ennes
Le type boolean permet de d�crire des valeurs bool�ennes qui ne peuvent avoir que deux valeurs�: true et false.
Caract�res
Le type char permet de d�crire des symboles Unicode de la table UTF-16 tels que�: 'a', 'A', '1', '@', '►', etc.
Nombres entiers
Les types byte, short, int et long, ainsi que d'une certaine mani�re le type char, permettent de d�finir des valeurs num�riques enti�res.
Nombres � virgule flottante
Les types float et double permettent de d�finir des valeurs num�riques � virgule flottante.
Tous ces types primitifs disposent de types objet �quivalents, dits wrapper (empaquetant) qui permettent de manipuler ces valeurs comme des objets. Par exemple le type boolean a pour type wrapper la classe java.lang.Boolean tandis que le type int a pour type wrapper la classe java.lang.Integer.
Non, ce n'est pas possible. Un type primitif ne peut pas �tre utilis� comme une r�f�rence. Cela implique�:
- il est impossible pour une variable d'un type primitif d'avoir la valeur null�;
- il est impossible d'invoquer une m�thode ou un membre sur un type primitif�: ils n'en ont aucun�;
- il est impossible d'affecter une valeur primitive dans une r�f�rence sans passer par un m�canisme de conversion implicite ou explicite�;
- il est impossible d'affecter la valeur d'une r�f�rence dans un type primitif sans passer par un m�canisme de conversion implicite ou explicite�;
- il est impossible d'utiliser un type primitif en tant que type g�n�rique dans une collection ou une classe qui supporte les Generics.
Cependant, � partir du JDK�1.5, le compilateur supporte le m�canisme d'auto-boxing/auto-unboxing qui permet de b�n�ficier d'un m�canisme de conversion implicite entre les types primitifs et les types wrapper objets �quivalents.
La valeur null est une valeur sp�ciale qui est affect�e aux r�f�rences d'objets ou de tableaux qui sont vides, c'est-�-dire qui ne contiennent pas d'instance d'objet ou de tableau. On peut la rapprocher de concepts et valeurs similaires dans d'autres langages tels que nil ou void. Toute r�f�rence peut avoir la valeur null ce qui inclut les r�f�rences contenues � l�int�rieur des tableaux ou des collections de m�me que les param�tres ou les valeurs de retour des m�thodes.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | int[] tableau1 = null; // Tableau null. String chaine = null; // Chaine null. Toto[] tableau2 = { null, null, null, null }; // Tableau contenant null. maMethode(null); // Passage de param�tre null. [...] public Toto maMethode(Tutu valeur) { [...] return null; // M�thode retournant null. } |
Tenter d'invoquer une m�thode ou d'acc�der � un membre d'instance sur une r�f�rence vide g�n�rera une exception de type java.lang.NullPointerException.
Code Java : | S�lectionner tout |
1 2 | String chaine = null; chaine.length(); // G�n�re une NullPointerException. |
La valeur null est un literal mais ne dispose pas d'un type wrapper. Cependant, depuis le JDK�1.1, l'API Java dispose de la classe java.lang.Void (avec un grand V) dont la seule valeur l�gale possible est la valeur null.
Code Java : | S�lectionner tout |
1 2 3 4 | public Void maMethode() { [...] return null; // Null est la seule valeur possible. } |
Attention�: contrairement � d'autres langages de programmation, la valeur null ne d�note pas une adresse m�moire � l'index�0.
Il existe plusieurs mani�res de tester si une r�f�rence contient la valeur null�:
Tests == et !=
Le test le plus simple consiste � utiliser le test d��galit� == ou de diff�rence !=. Pour tester qu'une variable r�f�ren�ant un objet est � la valeur null, il suffit de faire, par exemple�:
Code Java : | S�lectionner tout |
boolean test = (maReference == null);
Ou encore�:
Code Java : | S�lectionner tout |
1 2 3 4 | if (maReference == null) { // Traitement � effectuer en cas de r�f�rence nulle. [...] } |
Ou�:
Code Java : | S�lectionner tout |
1 2 3 4 | if (maReference�!= null) { // Traitement � effectuer en cas de r�f�rence non nulle. [...] } |
Attention�: la valeur null ne d�note pas une adresse m�moire � l'index�0. Et il n'est pas valide de tester l'�galit� d'une r�f�rence avec la valeur�0 pour tenter de v�rifier si elle est vide. Par exemple, de mani�re g�n�rale, le code suivant ne compile pas et n'est pas un test correct pour v�rifier qu'une r�f�rence est � la valeur null�:
Code Java : | S�lectionner tout |
1 2 | boolean testNull = (maReference == 0); // Test non valide. boolean testNonNull = (maReference�!= 0); // Test non valide. |
Note�: ce code peut cependant compiler si maReference est un type num�rique qui peut �tre converti en un type primitif par le m�canisme d'auto-unboxing. Le test pour v�rifier si la r�f�rence est null reste cependant non valide, et ce bout de code peut m�me mener � une NullPointerException si la r�f�rence est vide.
M�thodes de la classe Objects
Depuis le JDK�7, il est possible d'invoquer la m�thode publique statique isNull() de la classe utilitaire java.util.Objects pour tester si une r�f�rence est � la valeur null. Cette m�thode renvoie la valeur true si la r�f�rence contient la valeur null. La m�thode publique statique nonNull() permet d'effectuer le test oppos�.
Code Java : | S�lectionner tout |
1 2 | boolean testNull = Objects.isNull(maReference); // Renvoie true si la la r�f�rence est nulle. boolean testNonNull = Objects.nonNull(maReference); // Renvoie false si la la r�f�rence est nulle. |
La classe utilitaire java.util.Objects dispose, de plus, de plusieurs variantes de la m�thode publique statique requireNonNull() qui g�n�re une exception de type NullPointerException lorsque la r�f�rence test�e est � la valeur null. Cette m�thode est utile pour, par exemple, valider les param�tres re�us dans une m�thode et signaler les exceptions n�cessaires dans le cas contraire.
Code Java : | S�lectionner tout |
1 2 3 4 | public void maMethode(Toto maReference) throws NullPointerException { Objects.requireNonNull(maReference, "Le param�tre ne peut pas �tre null�!"); // G�n�re une exception si la r�f�rence est nulle. [...] // Corps de la m�thode. } |
Il existe plusieurs mani�res d��crire des commentaires (ou comments) dans du code Java�:
Commentaires sur une seule ligne
Les commentaires sur une seule ligne d�butent par le s�parateur // (deux ��barres obliques�� ou slash). Tout ce qui est situ� apr�s ce s�parateur, et ce, jusqu'� la fin de la ligne, sera consid�r� comme un commentaire et sera donc ignor� par le compilateur. Ces commentaires peuvent �tre plac�s sur leur propre ligne ou apr�s la fin d'une instruction.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 | // Commentaire #1. int unEntier = 5; // Commentaire #2. // Commentaire #3. // Commentaire #4. |
Commentaires sur plusieurs lignes
Les commentaires sur plusieurs lignes d�butent par le s�parateur /* (une barre oblique suivie d'une ���toile�� ou star). Tout ce qui est situ� apr�s ce s�parateur, y compris les sauts de ligne et retours chariot sera consid�r� comme un commentaire et sera donc ignor� par le compilateur. Pour terminer ce commentaire, il faut utiliser le s�parateur */.
Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | /* Ceci est un commentaire multiligne, je peux donc sauter des lignes sans difficult�. Et voici la fin du commentaire. */ int unEntier = 5; /* Il est aussi assez courant de mettre des �toiles * en d�but de chaque nouvelle ligne, * mais en fait rien ne vous y oblige. * C'est juste une convention de codage plut�t commune. */ String maChaine; |
Commentaires de documentation
Les commentaires de documentation sont une extension des commentaires sur plusieurs lignes. Ils d�butent par le s�parateur /** (barre oblique suivie de deux �toiles) et se termine par le s�parateur */. Ces commentaires permettent d'attacher de la documentation sur des membres, m�thodes ou classes pour d�crire leur comportement, leur condition d'utilisation, les cas particuliers, les plages de valeurs retourn�es ou encore les exceptions signal�es en cas d'erreur. Il est possible d'y ajouter du code via des balises HTML ou encore de rajouter des balises de documentation (javadoc tag ou documentation tag) qui permettront de formater correctement la page lorsque la documentation destin�e aux d�veloppeurs sera g�n�r�e � partir du code source. Les IDE modernes (NetBeans, Eclipse, IntelliJ IDEA, etc.) peuvent �galement afficher cette documentation lorsque vous �tes en train d'�diter du code dans cet IDE ce qui facilite le d�veloppement.
L�outil le plus connu pour g�n�rer la documentation � partir du code est le compilateur de documentation javadoc qui est fourni avec le JDK. Cependant, il est tout � fait possible d'utiliser des outils tiers, par exemple Doxygen, pour g�n�rer des pages de documentation �quivalentes. Les balises � utiliser et les formats de sortie support�s de m�me que la pr�sentation finale de la documentation d�pendent bien s�r de l'outil que vous utiliserez pour vos propres projets.
Prenons, par exemple, la m�thode contains() de la classe java.lang.String. Si on acc�de au code source de cette classe contenu dans le JDK ou via le d�p�t de code de l'OpenJDK, on peut lire�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | /** * Returns true if and only if this string contains the specified * sequence of char values. * * @param s the sequence to search for * @return true if this string contains {@code s}, false otherwise * @since 1.5 */ public boolean contains(CharSequence s) { // Contenu de la methode. [...] } |
Lorsque l'outil javadoc est lanc� sur le code de cette classe, ces quelques lignes de commentaires de description de cette m�thode vont servir � construire une

-
How to Write Doc Comments for the Javadoc Tool ;
-
Javadoc Tool Reference Page (Solaris, Linux, or Mac OS X)
-
Javadoc Tool Reference Page (Microsoft Windows)
-
Doxygen.
Pour d�finir les commentaires javadoc au niveau du package, il faut cr�er un fichier HTML nomm� package.html dans le r�pertoire du package. Ce fichier sera lu par l'outil javadoc pour g�n�rer la page de documentation du package, et son contenu (entre les balises <body> et </body>) sera alors utilis� comme commentaire pour le package, par exemple�:
Code HTML : | S�lectionner tout |
1 2 3 4 5 6 | <HTML> <BODY> Documentation du package <b>com.masociete.monpack</b>. @since 1.0 </BODY> </HTML> |
Depuis le JDK�5, le fichier package.html peut �tre remplac� par un fichier source Java sp�cial nomm� package-info.java. Ce fichier ne doit contenir que la ligne de d�claration du package, avec ses commentaires javadoc et surtout ses �ventuelles annotations. Par exemple�:
Code Java : | S�lectionner tout |
1 2 3 4 5 6 | /** * Documentation du package <b>com.masociete.monpack</b>. * @since 1.0 */ @MonAnnotation package com.masociete.monpack; |
-
Comment �crire des commentaires dans le code ?
-
Qu'est-ce qu'une annotation ?
-
Javadoc Tool Reference Page (Solaris, Linux, or Mac OS X)
-
Javadoc Tool Reference Page (Microsoft Windows)
En Java, les exceptions et les erreurs (errors), sont des objets servant � faire remonter des erreurs lors de l�ex�cution du code. Toutes les exceptions utilis�es dans la JVM ou que vous serez amen�s � impl�menter pour vos propres besoins h�ritent de la classe java.lang.Throwable (throwable signifie ��lan�able��). Cette classe dispose de m�thodes et propri�t�s qui sont donc accessibles par toutes les exceptions utilis�es dans la JVM et celles que vous serez amen� � impl�menter.
Une exception ou une erreur peut contenir un message d�crivant l'erreur et accessible via sa m�thode getMessage(). S'il existe, ce message peut �tre en anglais pour des exceptions fournies dans la JVM ou des biblioth�ques tierces (ou m�me dans une langue arbitraire dans ce dernier cas). Il peut �tre localis� dans la langue de votre syst�me d'exploitation si l'exception Java est g�n�r�e � partir d'une erreur syst�me. Pour vos exceptions personnalis�es, il reste enfin possible de fournir un message localis� en surchargeant la m�thode getLocalizedMessage().
Enfin, une exception ou une erreur permet d�acc�der � une trace, c'est-�-dire un tableau contenant les r�f�rences � l'empilement des classes, m�thodes et lignes de code travers�es jusqu�� l'instruction qui a g�n�r� l'exception. Cette trace peut �tre imprim�e dans la console ou un flux en invoquant une des variantes de la m�thode printStackTrace(). Depuis le JDK�1.4, il est �galement possible d�acc�der � ce tableau en invoquant la m�thode getStackTrace().
Le garbage Collector (ramasse-miette) est la partie de la JVM qui s'occupe de la r�cup�ration des zones m�moire. Les phases de lib�ration de la m�moire sont g�r�es de fa�on autonome, il est inutile de lui dire quand passer.
Il existe n�anmoins la fonction gc de la classe java.lang.System qui permet de faire un appel explicite au garbage collector. Cet appel ne garantit pas que tous les objets inutiles seront supprim�s de la m�moire.
Code java : | S�lectionner tout |
1 2 | System.gc (); //Appel explicite au Garbage collector |
Si les param�tres pass�s au constructeur sont incoh�rents ou que la construction provoque une erreur, la cr�ation de l'objet est impossible et doit �tre annul�e. Comme les m�thodes, les constructeurs peuvent g�n�rer des exceptions, c'est la fa�on la plus simple d'annuler l'ex�cution du constructeur. Techniquement, l'objet est cr�� en m�moire (l'allocation de la m�moire a lieu au moment de l'appel du constructeur), mais l'appelant �tant oblig� de traiter l'exception, le pointeur vers cet objet est perdu et sera donc r�cup�r� par le ramasse-miette.
Une solution plus �l�gante consiste � utiliser une m�thode statique servant de fabrique qui va v�rifier les param�tres et ne fait l'appel au constructeur que si ceux-ci sont corrects.
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Test { /** Le constructeur est d�clar� protected * pour interdire son utilisation par les clients de la classe. */ protected Test(int val) { } public static Test createTest(int val) { if (val < 100) { return new Test(val); } else { return null; // Ou alors on g�n�re une exception... } } } |
En utilisant la m�thode:
Code java : | S�lectionner tout |
Class c = Class.forName("com.developpez.MaClasse");
Il y a deux solutions�:
1 - la classe n'est pas pr�sente dans le CLASSPATH
C'est le cas le plus simple, il suffit d'utiliser un nouveau URLClassLoader � chaque fois pour recharger une nouvelle version de la classe.
Code java : | S�lectionner tout |
1 2 3 4 | // le chemin o� trouver la classe � recharger URL chemins[] = { new URL("file:/C:/MesClasses/") }; URLClassLoader loader = new URLClassLoader(chemins); Class c = loader.loadClass("com.developpez.MaClasse"); |
Si la classe est pr�sente dans le CLASSPATH c'est le ClassLoader du syst�me qui la charge (et la met dans son cache).
2 - La classe est pr�sente dans le CLASSPATH
Dans ce cas, on ne peut pas utiliser l'URLClassLoader. Il faut cr�er son propre ClassLoader qui h�rite de la classe ClassLoader
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import java.io.InputStream; public class MonLoader extends ClassLoader { public Class loadNewClass(String aName) throws Exception { InputStream is = getClass().getResourceAsStream("/" + aName); if (null == is) { return null; } byte buffer[] = new byte[is.available()]; is.read(buffer); Class c = defineClass(aName, buffer, 0, buffer.length); resolveClass(c); return c; } } |
Le fait de ne pas avoir red�fini la m�thode loadClass permet � ce nouveau ClassLoader d'utiliser le ClassLoader du syst�me pour charger d��ventuelles classes m�res ou interfaces.
Si la m�thode loadClass est red�finie il faut qu'elle puisse aussi trouver les super-classes et interfaces des classes qui seront charg�es, et ce, sans recharger celles d�j� pr�sentes dans le syst�me.
La m�thode toString() de la classe Object affiche le nom de l'objet suivi de la r�f�rence de l'objet dans la machine virtuelle (une sorte de pointeur).
Ceci peut s'av�rer utile parfois lors d'une phase de d�bogage, mais comment faire lorsqu'une classe (comme la classe String par exemple) red�finit la m�thode toString()�?
Il faut passer par la m�thode System.identityHashCode(Object).
Le code suivant retourne la m�me chose que le toString() d'Object pour n'importe quel type d'objet�:
Code java : | S�lectionner tout |
1 2 3 | public String getReference(Object anObject){ return anObject.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(anObject)); } |
System.currentTimeMillis()
En utilisant la m�thode statique currentTimeMillis() de la classe System. Cette m�thode renvoie un long repr�sentant la diff�rence de temps entre le 1er janvier 1970 � minuit et le temps syst�me � l'ex�cution de l'instruction. Cette diff�rence s'exprime en fonction de l'unit� de temps de l'OS (la milliseconde, voire quelques dizaines de millisecondes).
Code java : | S�lectionner tout |
1 2 3 4 | long start = System.currentTimeMillis(); // ... instructions � chronom�trer long duree = System.currentTimeMillis() - start; System.out.println(duree); |
System.nanoTime()
Depuis le JDK 5, il est possible d'utiliser la m�thode statique nanoTime() de la classe System. Elle renvoie un long repr�sentant la valeur du timer en nanosecondes.
Code java : | S�lectionner tout |
1 2 3 4 | long start = System.nanoTime(); // ... instructions � chronom�trer long duree = System.nanoTime() - start; System.out.println(duree); |
Ce temps n'est pas li� � un r�f�rentiel de temps universel, aussi ne doit-on l'employer que pour mesurer une diff�rence de temps. La pr�cision est de l'ordre de la nanoseconde.
Il faut aussi noter que ce n'est pas exactement le temps utilis� par votre application, mais le temps qui s'est �coul� depuis le d�but � la fin de votre code. Pendant ce temps, d'autres applications tournent sur votre ordinateur et utilisent ce qu'on appelle du temps CPU. Pour conna�tre exactement le temps CPU n�cessaire, il faut utiliser la m�thode getCurrentThreadCpuTime() de l'interface java.lang.management.ThreadMXBean � la place de System.nanoTime() ou currentTimeMillis() et vous aurez le temps CPU.
Il se peut que vous ayez d�j� rencontr� un cas de figure o� vous souhaitiez modifier l'une de vos valeurs (par exemple un Integer) pass�e en param�tre dans le corps de la m�thode :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class MyClass { public static void main(String args[]) { final A a = new A(); Integer integer = 0; a.increment(integer); if (integer != 1) { throw new RuntimeException(String.format("`integer` is equal to %d instead of 1.", integer)); } } } class A { public void increment(Integer integer) { integer += 1; // Ici, nous n'op�rons pas sur une r�f�rence mutable de `integer`. // `integer` est pass� par valeur ici. } } |
Code : | S�lectionner tout |
Exception in thread "main" java.lang.RuntimeException: `integer` is equal to 0 instead of 1.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.util.concurrent.atomic.AtomicReference; public class MyClass { public static void main(String args[]) { final A a = new A(); AtomicReference<Integer> integer = new AtomicReference<>(0); // on enveloppe notre entier // avec une instance de `AtomicReference`. a.increment(integer); // vaut 1. if (integer.get() != 1) { throw new RuntimeException(String.format("`integer` is equal to %d instead of 1.", 0)); } // pas d'erreur. } } class A { public void increment(AtomicReference<Integer> integer) { integer.set(1); // on met � jour `integer` se trouvant dans `main`. } } |
Bien entendu, si vous n'avez pas besoin de toutes les fonctionnalit�s de AtomicReference, vous pouvez simplement cr�er une classe g�n�rique.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class MyClass { public static void main(String args[]) { ReferenceHandler<Integer> handler = new ReferenceHandler<>(117); modify(handler); if (handler.get() != 259) { throw new RuntimeException("`handler.get()` isn't equal to 259."); } else { System.out.println("`handle.get()` is equal to 259."); } } public static void modify(ReferenceHandler<Integer> handler) { handler.set(259); } } class ReferenceHandler<T> { private T value; public ReferenceHandler(T value) { this.value = value; } public void set(T newValue) { this.value = newValue; } public T get() { return this.value; } } |
R�sultat:
Code : | S�lectionner tout |
1 2 | `handle.get()` is equal to 259. |
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.