Maison > Problème commun > le corps du texte

Quel est le principe du mécanisme de réflexion Java

DDD
Libérer: 2023-06-14 13:53:56
original
10410 Les gens l'ont consulté

Principe du mécanisme de réflexion Java : le code source que nous écrivons est un fichier .java, qui est compilé par javac et devient un fichier .class, c'est-à-dire un fichier de bytecode lorsque le programme est exécuté, la JVM chargera le classe. fichier de bytecode dans la mémoire. Au sens strict, on dit qu'il est chargé dans la zone de méthode et converti en un objet java.lang.Class. Par réflexion, nous pouvons construire une instance, obtenir la valeur de la variable membre, obtenir. la méthode et appelez-la.

Quel est le principe du mécanisme de réflexion Java

L'environnement d'exploitation de cet article : système Windows 10, version java17, ordinateur Dell g3.

Le principe de la réflexion est le suivant :

Le code source que nous écrivons est un fichier .java, qui devient un fichier .class après avoir été compilé par javac, c'est-à-dire un fichier de bytecode.

Lorsque le programme est exécuté, la JVM chargera le fichier de bytecode dans la mémoire à proprement parler, il sera chargé dans la zone méthode et converti en un objet java.lang.Class. Tout est un objet. La classe est appelée un objet de classe, qui décrit la structure des données d'une classe dans l'espace des métadonnées, y compris les attributs, les méthodes, les constructeurs, les annotations, les interfaces et d'autres informations définies dans la classe.

Grâce à la réflexion, nous pouvons construire des instances, obtenir les valeurs des variables membres, obtenir des méthodes et les appeler. Vous pouvez également obtenir des annotations définies sur les variables membres, les méthodes et les paramètres de méthode.

Code d'implémentation :

1) Construire une instance sans paramètre : appeler le constructeur sans paramètre par réflexion

//1.通过全类名加载字节码对象
Class clazz = Class.forName("com.example.lib.Person");
//2.通过类的字节码拿到定义的构造函数
Constructor constructor = clazz.getConstructor();
//3.通过构造方法创建对象
Object obj = constructor.newInstance();
Copier après la connexion

2) Construire une instance paramétrée :

//1.通过全类名加载字节码对象
Class clazz = Class.forName("com.example.lib.Person");
//2.通过类的字节码拿到定义的构造函数
Constructor constructor = clazz.getConstructor(int.class,String.class);
//3.通过构造方法创建对象
Object obj = constructor.newInstance(20,"xiaohua");
Copier après la connexion

3) Obtenir la valeur de la variable membre par réflexion.

//4.通过属性名获取属性
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);
//5.调用get方法拿到对象obj属性age的值
Integer age = (Integer) field.get(obj);
Copier après la connexion

4) Appelez la méthode de l'objet par réflexion.

//4.通过方法名和参数类型,拿到方法
method = clazz.getMethod("setAge", int.class);
//5.调用方法 obj是哪个对象身上的方法。
method.invoke(obj, 21);
method =  clazz.getMethod("getAge");
method.invoke(obj);
Copier après la connexion

5) Obtenez la valeur des variables statiques par réflexion.

//1.通过全类名加载字节码对象
 Class clazz = Class.forName("com.example.lib.Person");
 //2.获取静态属性ID
 Field  field = clazz.getField("ID");
 field.setAccessible(true);
 //3.拿到静态属性ID的值。
 // 因为静态变量存在方法区,在对象创建之前,就已经加装到了内存
 //所以,没有对象,也可以获取变量的值,这里传null也是可以的。
 int id = (int) field.get(null);
Copier après la connexion

Obtenez la valeur de l'annotation définie par réflexion

1) Obtenez l'annotation et la valeur de la variable membre.

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
    int value();
}
Copier après la connexion
public class MainActivity {
    @BindView(10000)
    TextView textView;
}
Copier après la connexion
//10通过反射拿到定义在属性上的注解
Class  clazz = MainActivity.class;
Field textView = clazz.getDeclaredField("textView");
BindView bindView = textView.getAnnotation(BindView.class);
int txtId = bindView.value();
Copier après la connexion

3) Obtenez les annotations et les valeurs définies sur la méthode et les paramètres de la méthode par réflexion

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Post {
    String value() default "";
}
Copier après la connexion
public interface NetWorkInterface {
    @Post("http://www.baidu.com")
    Call getPerson(@Queue("name") String name, @Queue("200") int price);
}
Copier après la connexion
//11通过反射拿到方法上定义的注解
  clazz = NetWorkInterface.class;
  Method method = clazz.getMethod("getPerson", String.class, int.class);
  //获取Post注解
  Post post = method.getAnnotation(Post.class);
  //获取值
  String url = post.value();
Copier après la connexion
//12通过反射拿到参数上的注解
//为是个二维数组,因为方法参数会有多个,一个参数有可能定义多个注解
Annotation[][] annotations = method.getParameterAnnotations();
for (Annotation[] ans : annotations) {
    for (Annotation an : ans) {
        if (an instanceof Queue) {
            Queue queue = (Queue) an;
            String value = queue.value();
        }
    }
}
Copier après la connexion

4) Obtenez les types de paramètres et de valeurs de retour de la méthode.

//13.拿到方法参数的类型。
Type[] types = method.getGenericParameterTypes();
for (Type type : types) {
    System.out.println(type.toString());
}
//14.获取方法返回值类型
Type type = method.getGenericReturnType();
Copier après la connexion

Résumé :

Grâce à la réflexion, vous pouvez obtenir les valeurs des variables membres sur l'objet, appeler des méthodes et obtenir des annotations définies sur les variables membres, les méthodes et les paramètres de méthode. La mise à niveau utilise la technologie d'annotation plus de réflexion et un proxy dynamique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!