按照千鋒的java基礎教程走發現了問題獲得屬性的時候會產生空指針異常
請求得到字段時會得到包括class在內的屬性,而Class屬性得不到方法,所以會導致後面的invoke方法出現空指針異常;
//會得到null的返回值
Method writeMethod = pD.getWriteMethod();
//調用時發生空指針異常
writeMethod.invoke(bean,pname);
package DynamicBean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/**
* @anthor
* @create 2019-01-04-14:00
*/
public class BeanFactory {
private static Properties prop =new Properties();
//使用靜態塊讀取配置文件
static{
InputStream is =Thread.currentThread().getContextClassLoader().getResourceAsStream("DynamicBean/config.properties");
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object javaBean(String name) {
Object bean = null;
String beanname = prop.getProperty(name);
try {
//根據類名查找配置文件
Class<?> aClass = Class.forName(beanname);
String s = aClass.getSimpleName();
//必須加入無參構造器,不然反射會出現異常
bean = aClass.newInstance();
//獲取Javabean的描述信息;
BeanInfo bi = Introspector.getBeanInfo(aClass);
//屬性描述器
PropertyDescriptor[] proDescriptors = bi.getPropertyDescriptors();
for (PropertyDescriptor pD : proDescriptors) {
//獲取該屬性寫入的方法,其中會包括class屬性,必須篩選出去
if (pD.getName().equals("class"))
continue;
Method writeMethod = pD.getWriteMethod();
//獲取屬性名
String pname = s + "." + pD.getName();
pname = prop.getProperty(pname);
//調用方法,參數1:類,參數二:根據屬性名再次查找
writeMethod.invoke(bean,pname);
}
} catch (IntrospectionException | ReflectiveOperationException e) {
e.printStackTrace();
}
return bean;
}
public class JavaBeanTest {
public static void main(String[] args) {
//我按照視頻使用這種方法不行會報轉換錯誤異常
//Config config =(Config)BeanFactory.javaBean("bean.name");
Object o = BeanFactory.javaBean("bean.name");
System.out.println(o.toString());
}
}
}