使用配置文件动态生成一个javabean时产生空指针异常

按照千锋的java基础教程走发现了问题获得属性的时候会产生空指针异常
使用配置文件动态生成一个javabean时产生空指针异常_第1张图片
请求得到字段时会得到包括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());
    }
}

}



你可能感兴趣的:(java)