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 classes
DrapeauValeurDéfinition
ACC_PUBLIC0x0001La classe est publique et donc accessible à l'extérieur de son paquetage.
ACC_FINAL0x0010La classe est finale et donc ne peut être étendue.
ACC_SUPER0x0020La classe est considérée comme une superclasse.
ACC_INTERFACE0x0200La classe est en fait une interface.
ACC_ABSTRACT0x0400La classe est abstraite et donc ne peut être instanciée.
Les champs
DrapeauValeurDéfinition
ACC_PUBLIC0x0001Le champ est public et donc peut être accédé à l'extérieur de son paquetage.
ACC_PRIVATE0x0002Le champ est privé et donc ne peut être utilisé qu'au sein de sa classe.
ACC_PROTECTED0x0004Le champ est protégé, et donc peut être accédé à l'intérieur des sous-classes.
ACC_STATIC0x0008Le champ est statique et est donc accessible au sein de la classe et non d'un objet.
ACC_FINAL0x0010Le champ est final et donc ne peut être réaffecté.
ACC_VOLATILE0x0040Le champ est volatile et donc ne peut être caché.
ACC_TRANSIENT0x0080Le champ est transient et ne peut donc être lu ou écrit par un gestionnaire d'objet persistant.
Les méthodes
DrapeauValeurDéfinition
ACC_PUBLIC0x0001La méthode est publique et peut donc être accédée à l'extérieur de son paquetage.
ACC_PRIVATE0x0002Le méthode est privée et n'est donc accessible qu'au sein de sa classe.
ACC_PROTECTED0x0004La méthode est protégée et peut donc être accédée par des sous-classes.
ACC_STATIC0x0008La méthode est statique et ne peut être utilisée que par la classe et non par un objet.
ACC_FINAL0x0010La méthode est finale et ne peut donc être surchargée.
ACC_SYNCHRONIZED0x0020La méthode est synchronisée et ne peut donc être invoquée que si le verrou est levé.
ACC_NATIVE0x0100La méthode est native indiquant qu'elle est écrite dans un autre langage que Java.
ACC_ABSTRACT0x0400La méthode est abstraite signifiant qu'aucune implémentation n'est fournie.
ACC_STRICT0x0800La méthode est strictfp indiquant que le mode de virgule flottante est du type FP-strict.
Les classes imbriquées
DrapeauValeurDéfinition
ACC_PUBLIC0x0001La classe imbriquée est déclarée explicitement ou implicitement publique.
ACC_PRIVATE0x0002La classe imbriquée est déclarée explicitement privée.
ACC_PROTECTED0x0004La classe imbriquée est déclarée explicitement protégée.
ACC_STATIC0x0008La classe imbriquée est déclarée explicitement ou implicitement statique.
ACC_FINAL0x0010La classe imbriquée est déclarée explicitement finale.
ACC_INTERFACE0x0200La classe imbriquée est en fait une interface.
ACC_ABSTRACT0x0400La classe imbriquée est déclarée explicitement ou implicitement abstraite.
Exemple [voir]
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;
  }
}