[JAVA] Compétences de puissance qui peuvent être utilisées rapidement à tout moment - Réflexion

Qu'est-ce que la réflexion?

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.

Que pouvez-vous faire avec la réflexion

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
    }
  }
}

Soyez prudent avec la réflexion

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.

Au fait, n'y a-t-il pas beaucoup de code de routine?

Je vais les mettre tous ensemble.

https://github.com/Drivemode/Intenso

Recommended Posts

Compétences de puissance qui peuvent être utilisées rapidement à tout moment - Réflexion
[Affichage message ERREUR] Version simple utilisable à tout moment avec le gabarit partiel des rails
Organiser les méthodes qui peuvent être utilisées avec StringUtils
À propos du problème que hidden_field peut être utilisé de manière insensée
Touches de raccourci pratiques pour Eclipse
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Base de données Firebase-Realtime sur Android pouvant être utilisée avec copie
Outil d'analyse statique pouvant être utilisé avec GitHub [version Java]
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
J'ai posé une question qui peut être utilisée pour des entretiens techniques
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
Lock_version peut être utilisé pour les tables qui ont tendance à accéder et à modifier le même enregistrement en même temps
Traitement d'entrée / sortie de fichier Java pouvant être utilisé via l'historique
Peut-être peut-il être utilisé lors d'une fête de fin d'année? Code du jeu Mosaic
Implémentation de machine à sous simple qui peut être utilisée avec copie
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK
Méthodes de tableau Ruby pouvant être utilisées avec Rails (autres que chacun)