Reflection est un groupe d'API inclus dans la bibliothèque standard Java pour gérer les méta-informations des classes, et est regroupé dans le package java.lang.reflect
.
Reflection vous permet de lire une liste de constructeurs, de méthodes et de champs définis dans une classe, d'appeler des méthodes à partir de celle-ci et de récupérer des valeurs de champ. Normalement, la procédure de création directe d'une instance et d'appel d'une méthode sans utiliser de réflexion est suffisante, mais avec réflexion, vous pouvez effectuer des techniques de triche telles que l'accès à des méthodes invisibles et la modification des champs finaux
. Devenir.
Tous les types ont un littéral appelé «.class». String.class
vous donnera une classe Class
avec des informations sur la classe String
.
La classe Class
comprend une méthode pour rechercher quelle méthode est définie dans la classe cible et une méthode pour récupérer des informations sur le champ défini. De plus, getClass ()
est défini dans toutes les classes comme une méthode d'instance, et vous pouvez également utiliser cette méthode pour obtenir la classe Class
.
Par exemple, ce qui suit vous permettra d'appeler les méthodes initialement invisibles définies dans private
.
//Une classe accessible par réflexion.
public class Something {
private String hoge() {
return "hoge";
}
}
public class Main {
public static void main(String[] args) {
Something target = new Something();
try {
Class<Something> clazz = target.getClass(); //Puisque la classe est un mot réservé, il est d'usage d'utiliser clazz ou klass.
Method method = clazz.getDeclaredMethod("hoge", null); //Le deuxième argument est un tableau de types d'arguments pour la méthode à appeler. Défini sur null s'il n'est pas présent
method.setAccessible(true); //Une méthode magique qui rend une méthode qui ne devrait pas être visible
String result = (String) method.invoke(target, null); //L'instance qui appelle la méthode dans le premier argument, l'argument réel après le deuxième argument
System.out.println(result); // "hoge"Est sortie
} catch (NoSuchMethodException e) {
//Lorsqu'aucune méthode ne correspond au nom de la méthode spécifié dans la chaîne de caractères
} catch (InvocationTargetException e) {
//Lorsqu'une exception se produit dans la méthode appelée
} catch (IllegalAccessException e) {
//Lors de l'accès à une méthode inaccessible
}
}
}
Lors de l'exécution d'un programme qui utilise la réflexion, certaines machines virtuelles ont des règles strictes d'accès par réflexion. Dans ce cas, appeler setAccessible (true)
lèvera une SecurityException
.
De plus, la réflexion spécifie les noms de toutes les méthodes, classes et champs sous forme de chaînes, il y a donc une exception s'il n'y a pas de correspondance pour ces chaînes. Par conséquent, lors de l'obscurcissement du code avec ProGuard etc., il est nécessaire de faire attention au code utilisant la réflexion (car même si le nom du champ ou le nom de la méthode est changé, la chaîne de caractères n'est pas modifiée).
De plus, contrairement aux appels de méthode normaux, il passe par l'API de réflexion, ce qui affecte inévitablement les performances.
Inutile de dire que vous pouvez accéder de force à des éléments auxquels vous ne pouvez pas accéder normalement ou que vous pouvez réécrire les données, veuillez donc suivre le dosage et l'utiliser correctement.
Je vais les mettre tous ensemble.
https://github.com/Drivemode/Intenso