使用配置文件動態生成一個javabean時產生空指針異常

按照千鋒的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());
    }
}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章