English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
本文实例讲述了Java编程反射机制用法。分享给大家供大家参考,具体如下:
前言:反射:动态获取类(字节码文件如本篇中的Person.class),并对其成员进行运行。反射在Android应用层的开发中可能遇到会稍微少一点,但对于想打通底层的小伙伴来说,必须要熟练掌握运用。
实体类
Person.java
package com.sunwenou.reflect;// 包名 public class Person { private String name; private int age; public Person() {// 无参 } public Person(String name, int age) {// Parameterized super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name+","+age; } public void show() { // Parameterless System.out.println("show"); } public void fun(String ss) { // Parameterized System.out.println(ss); } public static void function() { // Static System.out.println("static"); } }
Dynamic acquisition of bytecode file method
In this article, to make the blog look concise, exceptions are thrown in general, and imports are omitted as before.
package com.sunwenou.reflect; public class Demo1 { /** * Dynamic acquisition of bytecode file method * 1:Use the Class getClass() method provided by Object class * This method requires an object * 2:Each data type has a static class attribute, this attribute returns the bytecode file object of this data type * int.class Person.class * 3:Use the forName() method provided by Class * Only a string needs to be provided, this string is composed of the package name+Class name composition */ public static void main(String[] args) throws Exception { //getClaz(); //getCalz2() getClaz3() } //Use the forName() method provided by Class public static void getClaz3() throws Exception { Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person"); System.out.println(claz==claz2); } //Each data type has a static class attribute public static void getCalz2() { Class<Person> p1 = Person.class; Class<Person> p2 = Person.class; System.out.println(p1==p2); } //Use the Class getClass() method provided by the Object class public static void getClaz() { Person person1 = new Person(); Class<? extends Person> claz = person1.getClass();//Person.class Person person2 = new Person(); Class<? extends Person> claz2 = person2.getClass();//Person.class System.out.println(claz==claz2); } }
Dynamic acquisition of class and object creation
package com.sunwenou.reflect; public class Demo2 { public static void main(String[] args) throws Exception { //createObj(); createObj2() } public static void createObj2() throws Exception { //Person person = new Person("lisi",23); //Obtenir l'objet bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class //Obtenir l'objet de type Constructor appartenant à la méthode de construction avec des paramètres Constructor constructor = claz.getConstructor(String.class,int.class); //Créer un objet en utilisant la méthode de création d'objet fournie par la classe Constructor Person person = (Person)constructor.newInstance("lisi",23); System.out.println(person); } public static void createObj() throws Exception { //Person person = new Person(); //Obtenir l'objet bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Object obj = claz.newInstance();//Créer l'objet par défaut en utilisant le constructeur sans paramètres System.out.println(obj); } }
Obtenir dynamiquement la classe et affecter une valeur au membre variable
package com.sunwenou.reflect; public class Demo3 { public static void main(String[] args) throws Exception { //Person p = new Person(); //p.name = "lisi"; //Obtenir l'objet bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //Obtenir l'objet de type Field appartenant au membre variable //Field field = claz.getField("name");//C'est un membre de permission public Field field = claz.getDeclaredField("name");//Obtenir tous les champs déclarés System.out.println(field); //Les variables membres non statiques dépendent de l'objet Object obj = claz.newInstance(); field.setAccessible(true);//Forcer l'accès, le rendre accessible field.set(obj, "张三"); System.out.println(obj); } }
Obtenir dynamiquement la classe et exécuter la méthode
package com.sunwenou.reflect; public class Demo4 { public static void main(String[] args) throws Exception { //method1() method2() method3() } public static void method3() throws Exception { //Obtenir l'objet bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("function", null); m.invoke(null, null); } ////Exécuter une méthode avec des paramètres public static void method2() throws Exception { //Obtenir l'objet bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("fun", String.class); Object obj = claz.newInstance(); m.invoke(obj, "hello"); } //Exécuter une méthode sans paramètres public static void method1() throws Exception { //Person person = new Person(); person.show(); //Obtenir l'objet bytecode Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //Obtenir l'objet bytecode de la méthode à exécuter Method m = claz.getMethod("show", null); //Les méthodes non statiques dépendent de l'objet Object obj = claz.newInstance(); //Exécuter la méthode m.invoke(obj, null); } }
Voici l'utilisation de base de la réflexion, nous pouvons créer des objets via les fichiers bytecode des objets lorsque nous ne pouvons pas créer des objets de manière normale, et exécuter les méthodes qu'ils contiennent, avez-vous appris cela ??
Les lecteurs intéressés par plus de contenu sur Java peuvent consulter les sujets spéciaux de ce site : "Entrée en matière et avancement dans la conception de programmes orientés objets Java", "Tutoriel sur les structures de données et algorithmes Java", "Résumé des techniques pour manipuler les nœuds DOM en Java", "Résumé des techniques pour manipuler les fichiers et dossiers en Java" et "Résumé des techniques pour manipuler les caches en Java"
J'espère que ce tutoriel pourra aider les développeurs Java dans leur conception de programmes.
Déclaration : le contenu de cet article est issu du réseau, propriété des auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet de manière volontaire. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique pertinente. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois confirmée, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.