美文网首页java codejavajava学习路
object is not an instance of dec

object is not an instance of dec

作者: 张文健 | 来源:发表于2016-12-09 10:52 被阅读139次

    背景

    在java中使用反射,将DataFromImp类的属性值赋值给DataToImp类的同名属性。代码示例如下,运行时会报错:

    object is not an instance of declaring class

    分析

    网上的分析一般都是说调用参数类(dataTo)未实例化,但非此场景,解决不了问题。

    method.invoke(dataTo, value);

    经过分析,发现此报错是由于赋值接收类(DataTo)类型声明错误引起的。DataTo类与DataToImp类都实现了DataInterFace接口,是两个实现类。如果实例化的dataTo与classTo接口相同,甚至实现代码也完全相同,也都会引起此错误。

    解决

    将 Class clazzTo = DataTo.class; 改为 Class clazzTo = DataToImp.class;


    //声赋值发起类
    DataInterFace dataFrom = new DataFromImp().setValueRandom();
    //声明赋值接收类
    DataInterFace dataTo = new DataToImp();
    //声明发起类类型
    Class clazzFrom = DataFromImp.class
    //获取发起类字段数组
    Field[] fieldFromArray = clazzFrom.getDeclaredFields();
    //制作发起类属性map,结构为:Map<fieldName,filedValue>
    Map<String,Integer> fieldNameFromMap = new HashMap<String,Integer>();
    for(int i=0;i<fieldFromArray.length;i++){
        fieldNameFromMap.put(fieldFromArray[i].getName(), i) ;
    }
    //声明接收类类型
    Class clazzTo = DataTo.class;
    //获取接收类字段数组
    Field[] fieldToArray = clazzTo.getDeclaredFields();
    //获取接收类第三个属性的字段名
    String filedTo = fieldToArray[2].getName()
    //获取接收类属性的类型描述
    PropertyDescriptor pd = new PropertyDescriptor(filedTo, clazzTo);
    //获取发起类的属性值
    Object value = fieldFromArray[fieldNameFromMap.get(filedTo)].get(dataFrom);
    //将发起类属性值赋值给接收类属性
    Method wM = pd.getWriteMethod();
    wM.invoke(dataTo, value);
    

    相关文章

      网友评论

        本文标题:object is not an instance of dec

        本文链接:https://www.haomeiwen.com/subject/qidemttx.html