Looking for java Answers? Try Ask4KnowledgeBase
Looking for java Keywords? Try Ask4Keywords

Java Language Champs Obtenir et définir


Exemple

À l'aide de l'API Reflection, il est possible de modifier ou d'obtenir la valeur d'un champ à l'exécution. Par exemple, vous pouvez l'utiliser dans une API pour extraire différents champs basés sur un facteur, comme le système d'exploitation. Vous pouvez également supprimer des modificateurs comme final pour permettre la modification des champs qui sont finaux.

Pour ce faire, vous devrez utiliser la méthode Class # getField () de la manière indiquée ci-dessous:

// Get the field in class SomeClass "NAME".
Field nameField = SomeClass.class.getDeclaredField("NAME");

// Get the field in class Field "modifiers". Note that it does not 
// need to be static
Field modifiersField = Field.class.getDeclaredField("modifiers");

// Allow access from anyone even if it's declared private
modifiersField.setAccessible(true);

// Get the modifiers on the "NAME" field as an int.
int existingModifiersOnNameField = nameField.getModifiers();

// Bitwise AND NOT Modifier.FINAL (16) on the existing modifiers
// Readup here https://en.wikipedia.org/wiki/Bitwise_operations_in_C
// if you're unsure what bitwise operations are.
int newModifiersOnNameField = existingModifiersOnNameField & ~Modifier.FINAL;

// Set the value of the modifiers field under an object for non-static fields
modifiersField.setInt(nameField, newModifiersOnNameField);

// Set it to be accessible. This overrides normal Java 
// private/protected/package/etc access control checks.
nameField.setAccessible(true);

 // Set the value of "NAME" here. Note the null argument. 
 // Pass null when modifying static fields, as there is no instance object
nameField.set(null, "Hacked by reflection...");

// Here I can directly access it. If needed, use reflection to get it. (Below)
System.out.println(SomeClass.NAME);

Obtenir des champs est beaucoup plus facile. Nous pouvons utiliser Field # get () et ses variantes pour obtenir sa valeur:

// Get the field in class SomeClass "NAME".
Field nameField = SomeClass.class.getDeclaredField("NAME");

// Set accessible for private fields
nameField.setAccessible(true);

// Pass null as there is no instance, remember?
String name = (String) nameField.get(null);

Notez ceci:

Lorsque vous utilisez Class # getDeclaredField , utilisez-le pour obtenir un champ dans la classe elle-même:

class HackMe extends Hacked {
    public String iAmDeclared;
}

class Hacked {
    public String someState;
}

Ici, HackMe#iAmDeclared est déclaré champ. Cependant, HackMe#someState n'est pas un champ déclaré car il est hérité de sa super-classe, Hacked.