Java a une fonctionnalité appelée réflexion pour obtenir les informations de type d'un objet. Je connaissais le nom et le plan jusqu'à présent, mais je voulais le connaître correctement, alors je vais le résumer.
Java vous permet de récupérer et de manipuler dynamiquement les informations de type lors de l'exécution. En ingénierie de l'information, la technologie de lecture ou de réécriture de la structure du programme lui-même en cours d'exécution du programme est appelée réflexion. La réflexion Java fournit principalement les fonctions suivantes.
Freywork et d'autres utilisent cette réflexion pour accéder aux champs et aux méthodes d'appel.
Le mécanisme de réflexion de Java est rendu possible en utilisant les deux classes et fonctions suivantes.
java.lang.Class
java.lang.Class
Java fournit une classe appelée java.lang.Class
qui représente une classe. Chaque classe ou interface gérée dans le code source a un objet Class correspondant. Cela s'exprime par exemple par «Classe new
etc. Au lieu de cela, il est généré par la JVM lors du chargement de la classe ou automatiquement construit en appelant la méthode defineClass du chargeur de classe.
En Java, il est possible d'obtenir des informations de type à partir de l'objet Class généré.
Un chargeur de classe est un objet qui a littéralement le rôle de charger une classe. Lorsque vous obtenez l'objet Class à partir du code source, vous l'obtiendrez en interne à partir de ce chargeur de classe.
C'est si simple, mais j'aimerais utiliser la réflexion. Tout d'abord, préparez le cours simple suivant.
public class Foo {
Foo(String name){
this.name = name;
}
private String name;
public void greet(){
System.out.println("Hello, " + name);
}
}
Appelons Foo # greet ()
en utilisant la réflexion sur la classe Foo.class
ci-dessus.
import java.lang.reflect.Method;
public class ReflectionSample {
public static void main(String[] args) {
Class<Foo> fooClazz1 = Foo.class;
Foo foo = new Foo("taro");
try {
Method greetMethod = fooClazz1.getMethod("greet");
greetMethod.invoke(foo);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
Un appel de méthode pour une classe est effectué en utilisant java.lang.reflect.Method # invoke
.
La classe Method
peut être obtenue à partir de Class # getMethod
. Dans ce cas, spécifiez le nom de la méthode que vous souhaitez appeler.
Cette fois, «Foo # greet ()» n'a pas d'argument, mais vous pouvez passer l'argument de la méthode à appeler après le deuxième argument.
Résultat d'exécution
Hello, taro
Je ne l'utilise généralement pas lors de l'écriture d'applications professionnelles, mais j'ai pensé que je pourrais avoir des connaissances à ce sujet lors de la lecture du code du framework.
Recommended Posts