反射よりも強力なテクノロジー

3236 ワード

Javaを学ぶ過程で、いつも段階的に進んでいます.差はデータ型からIO、異常まで基礎部分(本によって異なる)ではありません.その後はJavaの進歩で、一般的には汎用、反射などを学ぶことができます.今日お話しすることは、反射と関係があり、「内省技術」と呼ばれています.「内省技術」は反射技術に基づいており、JavaBeanを操作しやすいAPIをより多く提供しています.一般的には、JavaWebを学んでこそJavaBeanと呼ぶことができるので、「内省技術」はJavaWebの内容(お笑いロジック、気にしないでください)に属していることがわかります.
1、内省とは
     前述したように、内省はJDKが提供するJavaBean操作のAPIであり、反射技術に基づいている.
2、コードで内省を実現する方法
     内省で使用されるクラスはIntrospectorであり,あくまで内省を学ぶことは学習クラスIntrospectorクラスの使用である.
内省技術は比較的簡単なので、以下は直接コードで例を挙げます.Personクラスを作成します.
public class Person{
    
    private String name;

    private String sex;

    /**
    *      get、set    
    */

    public Person(){

    }

}

クラスの準備ができたら、内省を使うことができます.
ステップ1:BeanInfoオブジェクトの取得
@Test
public void demo(){
    
    //  Introspector  getBeanInfo()  ,          Class  
    BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);

}

上のbeanInfoはPersonクラスの完全な情報です.
ステップ2:メソッド記述器とプロパティ記述器の取得
@Test
public void demo(){
    
    //  Introspector  getBeanInfo()  ,          Class  
    BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);

    
    /*********************   ****************************/
    
    //       
    MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
    
    //       ,  getPropertyDescriptors  ,    PropertyDescriptor  
    //    PropertyDescriptor      
    PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

}

その後、対応する操作ができます.JavaWebを学んだことがあるなら、フォームにはデータを自動的にカプセル化する機能があることを知っているはずです.実はその実現は内省技術であり、具体的には似たような例を挙げる.
要求:付与するデータをMapに挿入し、メソッドを使用してMapのデータをJavaBeanにカプセル化します.
私たちはあまり話をしないで、直接書き始めました.次のように、Mapの作成>Mapに値の割り当て->オブジェクトの作成->Mapの値をオブジェクトに渡す
@Test
public void demo(){
    
    //    Map
    Map p1 = new HashMap();
    
    // Map  ,  key Person     ,value     
    p1.put("name", "zack");
    p1.put("sex", "male");

    //  Person  
    Person person = new Person();

    //     ,     
    setData2Object(p1, person);
}

setData 2 Object()メソッドを使用しましたが、このメソッドを実装します.
private static void setData2Object(Map map, Object obj) 
                                        throws Exception {
    //  BeanInfo
    BeanInfo beanInfo = Introspector.getBeanInfo(person.getClass());

    //       
    PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

    //     
    for (PropertyDescriptor descriptor:propertyDescriptors) {
        
        //      Map     key
        String name = descriptor.getName();
        
        //     key   
        if (map.containsKey(name)){
            String value = map.get(name);
            
            //                
            Method writeMethod = descriptor.getWriteMethod();

            //      Value
            writeMethod.invoke(person, value);
        }
    }   
}

前述したように,属性記述器によって書き込み属性を得る方法がある.apiでは、プロパティ記述器には、getWriteMethod、getReadMethodの2つの方法があります.簡単に言えばget,setを取得する方法です.あとは反射を利用すればいいです.
さらに、内省属性記述器の個数は、属性の個数ではなくget、setメソッドによって算出される.たとえば、setAge、getNameは、前のsetとgetを削除し、属性名を取得します.