mian0ting 2015-03-14 04:03 采纳率: 0%
浏览 849

Java关于String转换其他数据类型的问题

小弟有个关于String转换其他数据类型的问题想请教各位大大,新手未有悬赏币,见谅。
下面贴代码,问题在最后。

person类

 package com.local.person.bean;

public class Person {
    private int id;
    private String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

RecordItem类

 public class RecordItem {

    private String key;
    private String value;

    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

转换方法BeanParser

 package com.local.person.bean;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class BeanParser {

    public static <T> List<T> parse(List<List> records, Class<T> classParam) throws InstantiationException, IllegalAccessException {
        List<T> list = new ArrayList<T>();
        Method[] methods = classParam.getMethods();
        for (int i = 0; i < records.size(); i++) {
            List<RecordItem> record = records.get(i);
            T bean = classParam.newInstance();
            for (int j = 0; j < record.size(); j++) {
                RecordItem item = record.get(j);
                for (Method method : methods) {
                    String methodName = method.getName();
                    if (methodName.startsWith("set")) {
                        String attr = methodName.substring(3).toLowerCase(Locale.getDefault());
                        if (attr.equals(item.getKey())) {
                            try {
                                method.invoke(bean, item.getValue());
                            } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            list.add(bean);
        }
        return list;
    }

}

执行下面的main方法

 package com.local.person.bean;

import java.util.ArrayList;
import java.util.List;


public class GetPersonList {

    public static void main(String[] args) {
        List<List> records = new ArrayList<List>();

        List<RecordItem> record1 = new ArrayList<RecordItem>();

        RecordItem item1 = new RecordItem();
        item1.setKey("id");
        item1.setValue("1");
        record1.add(item1);

        RecordItem item2 = new RecordItem();
        item2.setKey("name");
        item2.setValue("jack");
        record1.add(item2);

        List<RecordItem> record2 = new ArrayList<RecordItem>();

        RecordItem item3 = new RecordItem();
        item3.setKey("id");
        item3.setValue("2");
        record2.add(item3);

        RecordItem item4 = new RecordItem();
        item4.setKey("name");
        item4.setValue("tom");
        record2.add(item4);

        records.add(record1);
        records.add(record2);

        List<Person> personList = new ArrayList<Person>();
        try {
            personList = BeanParser.parse(records, Person.class);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < personList.size(); i++) {
            Person person = personList.get(i);
            System.out.println("id=" + person.getId() + ",name=" + person.getName());
        }

    }

}

事情是这样子的:有两条数据
id=1,name=jack
id=2,name=tom
放在两个RecordItem里面,外面套了两个List,我想把这两条数据装到两个Person里面,Person再放进List里面传回给main方法,main方法打印出来。
但是存在一个问题,就是Person里面的数据类型都是基本类型或封装类(不确定是什么实体类,里面会有什么数据类型),要怎么把RecordItem的String类型根据Person数据类型存进去,让method.invoke(bean, item.getValue());不报错???

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 12:22
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你已经正确地定义了一个Person对象和一个RecordItem对象,并且成功地使用反射来解析RecordItem中的键值对。然而,在尝试将这些解析后的对象放入List<Person>时,遇到了一个问题。

    当你试图调用Method.invoke(bean, item.getValue())时,你需要确保item.getValue()返回的是可以被Object类型的反射API访问的对象。如果你尝试将String转换为Integer或其他可序列化的类型,那么invoke()将会抛出一个ClassCastException。解决这个问题的方法是:

    • 将你的getValue()方法重写为返回Object类型。
    • 确保你的Person对象和RecordItem对象都继承自Serializable接口或者实现它。

    以下是一个修改后的版本:

    package com.local.person.bean;
    
    import java.io.Serializable;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    
    public class Person implements Serializable {
        // ...
    }
    
    // ... 其他类...
    

    然后在你的parse方法中,你可以像之前那样处理字符串。

    public static <T> List<T> parse(List<List> records, Class<T> classParam) throws InstantiationException, IllegalAccessException {
        List<T> list = new ArrayList<T>();
        Method[] methods = classParam.getMethods();
        for (int i = 0; i < records.size(); i++) {
            List<RecordItem> record = records.get(i);
            T bean = classParam.newInstance();
            for (int j = 0; j < record.size(); j++) {
                RecordItem item = record.get(j);
                for (Method method : methods) {
                    String methodName = method.getName();
                    if (methodName.startsWith("set")) {
                        String attr = methodName.substring(3).toLowerCase(Locale.getDefault());
                        if (attr.equals(item.getKey())) {
                            try {
                                method.invoke(bean, item.getValue());
                            } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            list.add(bean);
        }
        return list;
    }
    

    现在,当解析完所有记录后,list列表应该包含所有解析的Person对象。

    评论

报告相同问题?