反射よりも強力なテクノロジー
3236 ワード
Javaを学ぶ過程で、いつも段階的に進んでいます.差はデータ型からIO、異常まで基礎部分(本によって異なる)ではありません.その後はJavaの進歩で、一般的には汎用、反射などを学ぶことができます.今日お話しすることは、反射と関係があり、「内省技術」と呼ばれています.「内省技術」は反射技術に基づいており、JavaBeanを操作しやすいAPIをより多く提供しています.一般的には、JavaWebを学んでこそJavaBeanと呼ぶことができるので、「内省技術」はJavaWebの内容(お笑いロジック、気にしないでください)に属していることがわかります.
1、内省とは
前述したように、内省はJDKが提供するJavaBean操作のAPIであり、反射技術に基づいている.
2、コードで内省を実現する方法
内省で使用されるクラスはIntrospectorであり,あくまで内省を学ぶことは学習クラスIntrospectorクラスの使用である.
内省技術は比較的簡単なので、以下は直接コードで例を挙げます.Personクラスを作成します.
クラスの準備ができたら、内省を使うことができます.
ステップ1:BeanInfoオブジェクトの取得
上のbeanInfoはPersonクラスの完全な情報です.
ステップ2:メソッド記述器とプロパティ記述器の取得
その後、対応する操作ができます.JavaWebを学んだことがあるなら、フォームにはデータを自動的にカプセル化する機能があることを知っているはずです.実はその実現は内省技術であり、具体的には似たような例を挙げる.
要求:付与するデータをMapに挿入し、メソッドを使用してMapのデータをJavaBeanにカプセル化します.
私たちはあまり話をしないで、直接書き始めました.次のように、Mapの作成>Mapに値の割り当て->オブジェクトの作成->Mapの値をオブジェクトに渡す
setData 2 Object()メソッドを使用しましたが、このメソッドを実装します.
前述したように,属性記述器によって書き込み属性を得る方法がある.apiでは、プロパティ記述器には、getWriteMethod、getReadMethodの2つの方法があります.簡単に言えばget,setを取得する方法です.あとは反射を利用すればいいです.
さらに、内省属性記述器の個数は、属性の個数ではなくget、setメソッドによって算出される.たとえば、setAge、getNameは、前のsetとgetを削除し、属性名を取得します.
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を削除し、属性名を取得します.