Maison  >  Article  >  Java  >  Exemple d'analyse du principe du mécanisme de réflexion Java

Exemple d'analyse du principe du mécanisme de réflexion Java

WBOY
WBOYavant
2023-05-19 21:13:041011parcourir

Qu'est-ce que la réflexion ?

Le mécanisme de réflexion est à l'état d'exécution. Il offre à Java la possibilité de "faire fonctionner des objets". Dans l'état d'exécution, via l'objet fichier Class, vous pouvez appeler les attributs, les méthodes, etc. dans n'importe quelle classe. En plus des méthodes de construction, y compris privées, toutes les classes sont transparentes devant le mécanisme de réflexion

Mon propre résumé : tout dans cette classe peut être vu via l'objet Class file, et peut être utilisé et modifié

Exemple danalyse du principe du mécanisme de réflexion Java

La prémisse de la réflexion est d'obtenir l'objet fichier Classe ((objet bytecode)), alors il y a trois façons d'obtenir it :

#🎜 🎜#
  • Class.forName("full class name") ---- via la méthode statique de la classe Class (la plus couramment utilisée)

    # 🎜🎜#

  • Nom de la classe.class
  • Object.getClass()
  • //方式1:获取字节码对象,Class.forName("全类名")
    Class cla1 = Class.forName("Study01.Person");
    
    //方式2: 类名.Class
    Class cla2 = Person.class;
    
    //方式3:对象.getClass();
    Person per = new Person();
    Class cla3 = per.getClass();
    
    //这三个class对象都是由Person这个类生成的
    //那么我们看一下这三个字节码对象是不是同一个:
    
    System.out.println(cla1==cla2);
    System.out.println(cla2==cla3);
    # 🎜🎜#
  • //Résultat de sortie : Deux vrais

Conclusion :

L'objet bytecode est généré lorsque la classe est chargée et il n'y en a qu'un# 🎜🎜#
  • Peu importe la façon dont vous obtenez l'objet bytecode, c'est le même objet bytecode

  • Par réflexion Pour obtenir les attributs de la classe :

  • Après avoir obtenu l'objet bytecode Class, nous pouvons utiliser l'objet bytecode pour obtenir les attributs, méthodes, constructeurs et constructeurs de la classe que nous voulons obtenir Privé modifié

Partie de la méthode Class :

#🎜 🎜#1. Une classe Person avec deux attributs publics et deux privés (sans définir la construction et get/set, il suffit de voir si la réflexion peut obtenir la valeur à l'intérieur)

public class Person {

    private String name;  //名字
    private int age = 18;   //年龄

    public int ID = 123;   //身份证
    public String Sex;  //性别

    @Override
    public String toString(){
        return "姓名"+name+"年龄:"+age+"ID:"+ID+"性别:"+Sex;
    }
}

Classe Test : #🎜🎜 #
public class Test {

    public static void main(String[] args) throws ClassNotFoundException {

		//获取Class文件对象,用最常用的通过Class类的静态方法
        Class per = Class.forName("Test01.Person"); //这里是传入全路径!!从最外层的包名开始!
        //使用getFields()方法获取全部被public修饰的属性(方法上面的截图有)
        //并且返回的是Field类型的数组
        Field fields[] = per.getFields();
        for (Field field:fields) {
            System.out.println(field);
        }
    }
}

Sortie :

Nous avons obtenu avec succès tous les attributs publics de la classe PersonneExemple danalyse du principe du mécanisme de réflexion Java

2 Vous. peut également obtenir tous les attributs, y compris les privés : (Les autres codes ne seront pas réécrits) , récupérez les attributs publics et modifiez la valeur :

 for (Field field : per.getDeclaredFields()) {
            System.out.println(field);
        }

Output:

4. Modifier cette valeur : Reliez ici les valeurs des attributs publics modifiés ci-dessus :

	
	Field f = per.getField("Sex");
	System.out.println(f);
	
	//获取一个对象:
	Object obj = per.getConstructor().newInstance();
	//修改值:
	f.set(obj,"男");
	Person p = (Person)obj;
	
	System.out.println(p.Sex);
Exemple danalyse du principe du mécanisme de réflexion JavaOutput :

Through réflexion Récupérer les méthodes dans la classe (publique, privée, constructeur) :

Exemple danalyse du principe du mécanisme de réflexion JavaClasse personne :

   
        Person p = (Person)obj;
        
        //获取公有字段并调用,并修改
        Field f = per.getField("Sex");
        //获取一个对象:
        Object obj = per.getConstructor().newInstance();
        f.set(obj,"男");  //将Sex的属性修改成了 男

        //调用私有的属性,并修改
        f = per.getDeclaredField("name");
        //在访问私有的属性的值之前,先要设置运行访问↓
        //在访问之前忽略访问权限的检查,叫暴力反射
        f.setAccessible(true);
        f.set(obj,"张三");
        System.out.println("Person里面的信息是:"+p.toString());
    }
}

Classe de test :

public class Person {

    private String name;  //名字
    private int age = 18;   //年龄
    public int ID = 123;   //身份证
    public String Sex ;  //性别
    
    //构造:
    public Person() {}

    public Person(String name, int age, int ID, String sex) {
        this.name = name;
        this.age = age;
        this.ID = ID;
        Sex = sex;
    }
    
    //无参公有方法:
    public void eat(){
        System.out.println("我会吃饭");
    }
    
    //有参公有方法:
    public void eat(String food){
        System.out.println("我在吃:"+food);
    }
    
    //有参私有方法
    private void  play(String name){
        System.out.println(name+"在玩");
    }
}

Sortie : # 🎜🎜 #

-----Obtenez les méthodes publiques dans Person et la classe parent Object↓-----Exemple danalyse du principe du mécanisme de réflexion Javapublic void Test02.Person.eat(java.lang.String) # 🎜🎜#Nom de la méthode : manger

public void Test02.Person.eat()

Nom de la méthode : manger

public final void java.lang.Object.wait() lance java.lang. InterruptedException

Nom de la méthode : wait

public final void java.lang.Object.wait(long,int) lance java.lang.InterruptedException

Nom de la méthode : waitExemple danalyse du principe du mécanisme de réflexion Javapublic final native void java .lang.Object.wait(long) lance java.lang.InterruptedException

Nom de la méthode : wait

public boolean java.lang.Object.equals(java.lang.Object)

Nom de la méthode : égal à

public java.lang.String java.lang.Object.toString()

Nom de la méthode : toString

public native int java.lang.Object.hashCode()

Method nom :hashCode

public final native java.lang.Class java.lang.Object.getClass()

Nom de la méthode : getClass
public final native void java.lang.Object.notify()# 🎜 🎜#Nom de la méthode : notify

public final native void java.lang.Object.notifyAll()
Nom de la méthode : notifyAll

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer