在DaoSupport 的構建中,爲了實現經過傳入的參數(爲class<T>)來檢測正確和構造類的實例,可是當時使用的是java的反射機制和範型來實現的。暫且不討論範型和註解帶來的不便。那麼在java api中是否是還有替代上述方式來構建java bean呢?html
答案是有的。java
詳見包java.beans.git
我會經過調用github
——注意:api
必須注意的是java.beans.PropertyDescripto.getWriteMethod() /getReadMethod()的時候該類必須知足java bean 的格式要求,不然獲取的方法對象爲null.安全
測試代碼:oracle
package javabeans;學習
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.Beans;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;測試
import org.junit.Test;
/**
* javabean確實相對於java inflect來說要安全的多,能夠經過javabean來構建對象而不用擔憂和學習反射機制
* @author anping
*
*/
public class testJavabean {
@Test
public void testIntrospector() throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IOException{
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
BeanDescriptor bean = beanInfo.getBeanDescriptor();spa
System.out.println(「———-屬性修飾器———」);
User user = new User();
user.setAge(1);
user.setUsername(「1111″);
//拿到全部的屬性
PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor prop:props){
System.out.println(prop.getName());
//屬性調用getXXX的方法
System.out.println(prop.getReadMethod().invoke(user, null));
}
System.out.println(「===========構建bean=========」);
Beans beans = new Beans();
Object object= (User) beans.instantiate(User.class.getClassLoader(), User.class.getName());
System.out.println(object);
for(PropertyDescriptor prop:props){
if(prop.getName().equals(「age」)){
prop.getWriteMethod().invoke(object, 11);
}else if(prop.getName().equals(「username」)){
//屬性調用setXXX的方法
prop.getWriteMethod().invoke(object, 「aoing」);
}
}
User user2 = (User)object;
System.out.println(user2.getAge()+user2.getUsername());//11aoping
}
}