weixin_42360958 2010-09-13 16:49
浏览 245
已采纳

关于Java反射的问题

[code="java"]
List list = new ArrayList();
User user0 = new User();
user0.setUsername("ty");
user0.setAge(24);
user0.setTel("137***");
user0.setAddress("南京");
list.add(user0);

    User user1 = new User();
    user1.setUsername("tz");
    user1.setAge(21);
    user1.setTel("158***");
    user1.setAddress("南京");
    list.add(user1);
    String jsonArray = JSONHelper.getJSONByBeanList(list);
    System.out.println(jsonArray);

[/code]

[code="java"]
public static String getJSONByBeanList(List<?> list) {
try {
Class<?> clazz = list.get(0).getClass();
Field fields[] = clazz.getDeclaredFields();
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < fields.length; j++) {
Object objectCopy = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});
String fieldName = fields[j].getName();

String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字

String setMethodName = "set" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法
Method getMethod = clazz.getMethod(getMethodName,new Class[] {}); // 获得和属性对应的setXXX()方法
Method setMethod = clazz.getMethod(setMethodName, new Class[] { fields[j].getType() }); // 调用原对象的getXXX()方法
Object value = getMethod.invoke(objectCopy, new Object[]{});
System.out.println(fieldName+" "+value);
}
}
} catch (JSONException e) {
throw new JSONException("");
}catch (SecurityException e) {
e.printStackTrace();
}catch (NoSuchMethodException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {
e.printStackTrace();
}catch (InvocationTargetException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
}
return "";
}
[/code]

现在的问题是,如果传一个单一的Bean那可以获得bean的名字和值,但是把多个Bean存入List,这时候我就 [color=red][size=xx-large]吐血了[/size][/color]

我的其主要目的就是为了转换成json,我没用org.json那些jar包。
请教一下兄弟能否告诉我这么搞,我很纠结,小弟万分感谢
非诚勿扰。。。。

  • 写回答

2条回答 默认 最新

  • weixin_42525443 2010-09-13 20:22
    关注

    不好意思,写错了
    [code="java"]
    for (int i = 0; i < list.size(); i++) {

    Class<?> clazz = list.get(i).getClass();

    Field fields[] = clazz.getDeclaredFields();

    Object objectCopy = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});

    for (int j = 0; j < fields.length; j++) {

    String fieldName = fields[j].getName();

    String firstLetter = fieldName.substring(0, 1).toUpperCase();
    // 获得和属性对应的getXXX()方法的名字

    String getMethodName = "get" + firstLetter + fieldName.substring(1);
    // 获得和属性对应的setXXX()方法的名字

    String setMethodName = "set" + firstLetter + fieldName.substring(1);
    // 获得和属性对应的getXXX()方法

    Method getMethod = clazz.getMethod(getMethodName,new Class[] {});
    // 获得和属性对应的setXXX()方法

    Method setMethod = clazz.getMethod(getMethodName, new Class[] { fields[j].getType() }); // 调用原对象的getXXX()方法 !!

    Object value = getMethod.invoke(list.get(i), new Object[]{});

    setMethod.invoke(objectCopy , new Object[]{value });//!!!!

    System.out.println(fieldName+" "+value);

    }

    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题