La classe Modifier est une classe non-instanciable qui exporte les méthodes de classe afin de décoder les modificateurs pour les membres et les classes.
Les trois classes Field, Constructor et Method du paquetage java.lang.reflect, ainsi que la classe java.lang.Class possèdent un méthode getModifiers() capable de retourner un code entier représentant une combinaison de modificateurs. Par exemple, l'application de la méthode sur une classe publique et statique, donnera en retour une valeur égale à 17, car le modificateur public possède la valeur 1 (en hexadécimal : 0x0001) et le modificateur static, la valeur 16 (id : 0x0010).
Class classe = Class.forName("java.lang.StringBuffer"); int mod = classe.getModifiers(); System.out.println("Valeur des modificateurs de la classe " + classe.getName() + " :" + mod); Constructor constructeur = classe.getDeclaredConstructor(null); mod = constructeur.getModifiers(); System.out.println("Valeur des modificateurs du constructeur " + constructeur.getName() + " :" + mod); Method methode = classe.getDeclaredMethod("length", null); mod = methode.getModifiers(); System.out.println("Valeur des modificateurs de la méthode " + methode.getName() + " :" + mod);
La classe Modifier dispose essentiellement de méthodes statiques permettant de vérifier le type de modificateurs. Ces méthodes sont toutes préfixées par is suivi de l'identificateur du modificateur comme suit : isModificateur(). Elles prennent toutes un argument de type entier, représentant le modificateur à tester et retournent une valeur booléenne.
if(Modifier.isStatic(modificateur)){ System.out.println("Le modificateur testé est static !"); }
Plusieurs constantes statiques représentant des modificateurs sont également exploitables à partir de la classe Modifier.
System.out.println(Modifier.PROTECTED);
Les modificateurs sont encodés dans un type entier, et utilisent les constantes d'encodage définies par la spécification de la Machine Virtuelle Java.
Les classesDrapeau | Valeur | Définition |
---|---|---|
ACC_PUBLIC | 0x0001 | La classe est publique et donc accessible à l'extérieur de son paquetage. |
ACC_FINAL | 0x0010 | La classe est finale et donc ne peut être étendue. |
ACC_SUPER | 0x0020 | La classe est considérée comme une superclasse. |
ACC_INTERFACE | 0x0200 | La classe est en fait une interface. |
ACC_ABSTRACT | 0x0400 | La classe est abstraite et donc ne peut être instanciée. |
Drapeau | Valeur | Définition |
---|---|---|
ACC_PUBLIC | 0x0001 | Le champ est public et donc peut être accédé à l'extérieur de son paquetage. |
ACC_PRIVATE | 0x0002 | Le champ est privé et donc ne peut être utilisé qu'au sein de sa classe. |
ACC_PROTECTED | 0x0004 | Le champ est protégé, et donc peut être accédé à l'intérieur des sous-classes. |
ACC_STATIC | 0x0008 | Le champ est statique et est donc accessible au sein de la classe et non d'un objet. |
ACC_FINAL | 0x0010 | Le champ est final et donc ne peut être réaffecté. |
ACC_VOLATILE | 0x0040 | Le champ est volatile et donc ne peut être caché. |
ACC_TRANSIENT | 0x0080 | Le champ est transient et ne peut donc être lu ou écrit par un gestionnaire d'objet persistant. |
Drapeau | Valeur | Définition |
---|---|---|
ACC_PUBLIC | 0x0001 | La méthode est publique et peut donc être accédée à l'extérieur de son paquetage. |
ACC_PRIVATE | 0x0002 | Le méthode est privée et n'est donc accessible qu'au sein de sa classe. |
ACC_PROTECTED | 0x0004 | La méthode est protégée et peut donc être accédée par des sous-classes. |
ACC_STATIC | 0x0008 | La méthode est statique et ne peut être utilisée que par la classe et non par un objet. |
ACC_FINAL | 0x0010 | La méthode est finale et ne peut donc être surchargée. |
ACC_SYNCHRONIZED | 0x0020 | La méthode est synchronisée et ne peut donc être invoquée que si le verrou est levé. |
ACC_NATIVE | 0x0100 | La méthode est native indiquant qu'elle est écrite dans un autre langage que Java. |
ACC_ABSTRACT | 0x0400 | La méthode est abstraite signifiant qu'aucune implémentation n'est fournie. |
ACC_STRICT | 0x0800 | La méthode est strictfp indiquant que le mode de virgule flottante est du type FP-strict. |
Drapeau | Valeur | Définition |
---|---|---|
ACC_PUBLIC | 0x0001 | La classe imbriquée est déclarée explicitement ou implicitement publique. |
ACC_PRIVATE | 0x0002 | La classe imbriquée est déclarée explicitement privée. |
ACC_PROTECTED | 0x0004 | La classe imbriquée est déclarée explicitement protégée. |
ACC_STATIC | 0x0008 | La classe imbriquée est déclarée explicitement ou implicitement statique. |
ACC_FINAL | 0x0010 | La classe imbriquée est déclarée explicitement finale. |
ACC_INTERFACE | 0x0200 | La classe imbriquée est en fait une interface. |
ACC_ABSTRACT | 0x0400 | La classe imbriquée est déclarée explicitement ou implicitement abstraite. |
public class Introspection { public static void main(String[] args) { String ch = new String("Une chaîne de caractères..."); try { Class classe = Class.forName(args[0]); Vector vecteur = obtenirModificateurs(classe.getModifiers()); System.out.println("Les modificateurs de la classe " + classe.getName() + " : "); for(int i = 0; i < vecteur.size(); i++){ System.out.println(vecteur.elementAt(i)); } } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("La classe n'a pu être déterminée !"); } } /** * Cette méthode statique fournit la liste des modificateurs d'une classe. * @param valeur correspond au code numérique retourné par la méthode * getModifiers() de la classe Class. * @return Un vecteur contenant la liste * des modificateurs de la classe courante. */ public static Vector obtenirModificateurs(int valeur){ Vector res = new Vector(); if(valeur % 2 == 1){ //ACC_PUBLIC ^= 0x0001 ^= 1 res.add("publique"); valeur -= 1; } if(valeur >= 128){ //ACC_ABSTRACT ^= 0x0400 ^= 128 res.add("abstraite"); valeur -= 128; } if(valeur >= 64){ //ACC_INTERFACE ^= 0x0200 ^= 64 res.add("une interface"); valeur -= 64; } if(valeur >= 16){ //ACC_FINAL ^= 0x0010 ^= 16 res.add("finale"); valeur -= 16; } return res; } } |