Heim  >  Artikel  >  Java  >  So implementieren Sie den Java-Introspektionsmechanismus

So implementieren Sie den Java-Introspektionsmechanismus

WBOY
WBOYnach vorne
2023-04-24 08:04:061547Durchsuche

    Concept

    JavaBean

    In der tatsächlichen Programmierung benötigen wir häufig einige Klassen, die zum Verpacken von Wertobjekten verwendet werden, z. B. Student, Employee und Order. Diese Klassen verfügen häufig nicht über Geschäftsmethoden, sondern nur zum Speichern Zu verarbeitende Entitäten sind gekapselt und haben die folgenden Eigenschaften:

    • Attribute sind alle privat;

    • verfügt über eine öffentliche Konstruktormethode ohne Parameter;

    • stellt nach Bedarf öffentliche getXxx-Methoden bereit für private Attribute;

    Zum Beispiel: Wenn der Attributname name ist, gibt die Methode getName den Wert des Attributnamens zurück und die Methode setName legt den Namenswert fest. Beachten Sie, dass der Name der Methode normalerweise get oder set plus ist Der Attributname und der erste Buchstabe des Attributnamens werden großgeschrieben. Getter/Setter müssen Rückgabewerte und keine Methodenparameter haben

    Zum Beispiel das folgende Beispiel:

    So implementieren Sie den Java-Introspektionsmechanismus

    Klassen, die diese Eigenschaften erfüllen, werden JavaBeans genannt;

    Selbstbeobachtung

    Der Selbstbeobachtungsmechanismus (Inspektor) basiert auf Reflexion und ist eine Standardverarbeitungsmethode der Java-Sprache für die Bean-Klasse Eigenschaften und Ereignisse.

    Solange es eine getXXX-Methode oder eine setXXX-Methode oder sowohl getXXX- als auch setXXX-Methoden in der Klasse gibt, hat die getXXX-Methode keine Methodenparameter und einen Rückgabewert; die setXXX-Methode hat keinen Rückgabewert und einen Methodenparameter ; dann berücksichtigt der Selbstbeobachtungsmechanismus, dass XXX ein Attribut ist;

    Im folgenden Code wird beispielsweise das Altersattribut überhaupt nicht in der Employee-Klasse deklariert, sondern nur solche Getter und Setter ein Attribut sein

    package com.shixun.introspector;
    
    public class Employee {
        private String name;
        private Double score;
    
        // age将被内省认为是属性
        public int getAge(){
            return 30;
        }
    
        // name将被内省认为是属性
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        // score将被内省认为是属性
        public Double getScore() {
            return score;
        }
    
        public void setScore(Double score) {
            this.score = score;
        }
    
        public static void main(String[] args) {
            
    
        }
    }

    Verwandte API

    Verwandt mit Java-Introspektion Die Hauptklassen und Schnittstellen sind:

    java.beans.Introspector-Klasse: Bietet Standardmethoden zum Abrufen von JavaBean-Eigenschaften, -Ereignissen usw Methoden: Verwenden Sie normalerweise die Methode getBeanInfo, um das BeanInfo-Objekt zurückzugeben stellt das Rückgabe-Eigenschaftsdeskriptorobjekt (PropertyDescriptor), das Methodendeskriptorobjekt (MethodDescriptor) und die Bean-Methode des Deskriptorobjekts (BeanDescriptor) bereit.
    • java.beans.Introspector类: 为获得JavaBean属性、事件、方法提供了标准方法;通常使用其中的getBeanInfo方法返回BeanInfo对象;

    • Java.beans.BeanInfo接口:不能直接实例化,通常通过Introspector类返回该类型对象,提供了返回属性描述符对象(PropertyDescriptor)、方法描述符对象(MethodDescriptor) 、 bean描述符(BeanDescriptor)对象的方法;

    • Java.beans.PropertyDescriptor类Java.beans.PropertyDescriptor-Klasse: wird zum Beschreiben einer Eigenschaft verwendet , die über Getter- und Setter-Methoden verfügt;

    Sie können die Methoden der PropertyDescriptor-Klasse verwenden, um eigenschaftsbezogene Informationen abzurufen. Die getName-Methode gibt beispielsweise den Namen der Eigenschaft zurück:

    PropertyDescriptor-Klasse definiert Methoden, die den Getter abrufen können und Setter-Methoden der Eigenschaft Gibt die Setter-Methode zurück Objekt, das dem Attribut entspricht Verwenden Sie die BeanInfo-Schnittstelle, um das BeanInfo-Objekt abzurufen, und rufen Sie dann die PropertyDescriptor-Attributbeschreibung über das BeanInfo-Objekt ab

     //获取BeanInfo的对象
     BeanInfo employeeBeanInfo = Introspector.getBeanInfo(Employee.class);
     //通过BeanInfo对象获取PropertyDescriptor属性描述
     PropertyDescriptor[] propertyDescriptors = employeeBeanInfo.getPropertyDescriptors();
     System.out.println("通过Inspector内省机制获取JavaBean属性======= 打印所有信息 ====================");
     Arrays.stream(propertyDescriptors).forEach(f->{
         System.out.println("====================================");
         System.out.println("属性名:"+f.getName());
         System.out.println("类型:"+f.getPropertyType());
         System.out.println("get方法:"+f.getReadMethod());
         System.out.println("set方法:"+f.getWriteMethod());
     });
    
    // 或者用增强for
    System.out.println("通过Inspector内省机制获取JavaBean属性======= 打印所有信息 ====================");
    for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    	System.out.println("====================================");
        System.out.println("名字:" + propertyDescriptor.getName());
        System.out.println("类型:" + propertyDescriptor.getPropertyType());
        System.out.println("get方法:" + propertyDescriptor.getReadMethod());
        System.out.println("set方法:" + propertyDescriptor.getWriteMethod());
    }

    Das laufende Ergebnis ist wie folgt:Alle Codes sind unten angehängt! ! ! ! ! ! Hinweise zu SelbstbeobachtungsattributenViele Frameworks verwenden den Selbstbeobachtungsmechanismus, um die Attribute von Objekten abzurufen. Beim Definieren von Attributnamen ist es am besten, den Namen mit mindestens zwei Kleinbuchstaben zu beginnen, z. B. stuName, anstatt Bei Verwendung von sName kann es in einigen Fällen dazu kommen, dass Attribute nicht abgerufen werden. Wenn der Selbstprüfungsmechanismus Attribute abruft, bestätigt er den Attributnamen basierend auf den Getter- und Setter-Methoden und nicht basierend auf dem in deklarierten Mitgliedsvariablennamen die Klasse;

    Vollständiger Code

    //创建Employee的对象
    Class<?> clazz = Class.forName("com.shixun.introspector.Employee");
    Object employee = clazz.newInstance();
    
    //遍历属性描述对象
    for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
        //打印属性名称
        System.out.println(propertyDescriptor.getName());
        //判断属性名称是不是name
        if (propertyDescriptor.getName().equals("name")) {
            //setter方法
            Method writeMethod = propertyDescriptor.getWriteMethod();
            //调用setName方法
            writeMethod.invoke(employee, "jack");
            //getter方法
            Method readMethod = propertyDescriptor.getReadMethod();
            //调用getName方法
            Object nameValue = readMethod.invoke(employee);
            System.out.println("name属性的值为:" + nameValue);
        }
        //判断属性名称是否为score
        if (propertyDescriptor.getName().equals("score")) {
            //setter方法
            Method scoreWriteMethod = propertyDescriptor.getWriteMethod();
            //调用setScore方法
            scoreWriteMethod.invoke(employee, new Double(3000));
            //getter方法
            Method scoreReadMethod = propertyDescriptor.getReadMethod();
            Object scoreValue = scoreReadMethod.invoke(employee);
            System.out.println("score属性的值为:" + scoreValue);
        }
    }
    System.out.println("当前对象的信息:"+employee.toString());

    Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Java-Introspektionsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen