Looking for java Keywords? Try Ask4Keywords

Java Language Получение и настройка полей


пример

Используя Reflection API, можно изменить или получить значение поля во время выполнения. Например, вы можете использовать его в API для извлечения разных полей на основе фактора, например ОС. Вы также можете удалить модификаторы, такие как final чтобы поля модификации были окончательными.

Для этого вам нужно будет использовать метод Class # getField () таким образом, который показан ниже:

// 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);

Получение полей намного проще. Мы можем использовать Field # get () и его варианты, чтобы получить его значение:

// 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);

Обратите внимание:

При использовании класса # getDeclaredField используйте его для получения поля в самом классе:

class HackMe extends Hacked {
    public String iAmDeclared;
}

class Hacked {
    public String someState;
}

Здесь HackMe#iAmDeclared является объявленным полем. Однако HackMe#someState не является объявленным полем, поскольку он унаследован от своего суперкласса Hacked.