为了账号安全,请及时绑定邮箱和手机立即绑定

Java类型转换疑惑

Java类型转换疑惑

牧羊人nacy 2019-03-01 10:28:07
通过反射调用方法,需要传入方法需要的参数:public Object invoke(Object obj, Object... args) 我写了一个方法,type 表示参数的类型,values 是参数对应的值。本来是这么写的: /** * 类型转换 * @param type * @param values * @return */ private static Object transform(Class<?> type, String[] values) { if(type.isArray()) { Class<?> clazz = type.getComponentType(); Object [] params = new Object[values.length]; //这里有问题! for (int i = 0; i < values.length; i++) { params[i] = typeTransform(clazz, values[i]); } return params; } else { return typeTransform(type, values[0]); } } private static Object typeTransform(Class<?> type, String value) { String typeName = type.getName(); if("java.lang.String".equals(typeName)) return value.toString(); else if("java.lang.Integer".equals(typeName) || "int".equals(typeName)) return Integer.valueOf(value); else if("java.lang.Boolean".equals(typeName) || "boolean".equals(typeName)) return Boolean.valueOf(value); else if("java.lang.Double".equals(typeName) || "double".equals(typeName)) return Double.valueOf(value); else if("java.lang.Float".equals(typeName) || "float".equals(typeName)) return Float.valueOf(value); else if("java.lang.Long".equals(typeName) || "long".equals(typeName)) return Long.valueOf(value); else if("java.lang.Short".equals(typeName) || "short".equals(typeName)) return Short.valueOf(value); else return null; } 如果type是数组,则创建Object数组,但是这样造成的问题就是通过反射调用时,如果方法需要String类型的数组,这里给的Object类型的数组,则会报错:java.lang.IllegalArgumentException: argument type mismatch,我试图改成下面的代码: /** * 类型转换 * @param type * @param values * @return */ private static Object transform(Class<?> type, String[] values) { if(type.isArray()) { Class<?> clazz = type.getComponentType(); Object [] params; if("java.lang.String".equals(clazz.getName())){ params = new String[values.length]; } else if("java.lang.Integer".equals(clazz.getName()) || "int".equals(clazz.getName())) { params = new Integer[values.length]; } else if("java.lang.Boolean".equals(clazz.getName()) || "boolean".equals(clazz.getName())) { params = new Boolean[values.length]; } else if("java.lang.Double".equals(clazz.getName()) || "double".equals(clazz.getName())) { params = new Double[values.length]; } else if("java.lang.Float".equals(clazz.getName()) || "float".equals(clazz.getName())) { params = new Float[values.length]; } else if("java.lang.Long".equals(clazz.getName()) || "long".equals(clazz.getName())) { params = new Long[values.length]; } else if("java.lang.Short".equals(clazz.getName()) || "short".equals(clazz.getName())) { params = new Short[values.length]; } else { params = new Object[values.length]; } for (int i = 0; i < values.length; i++) { params[i] = typeTransform(clazz, values[i]); } return params; } else { return typeTransform(type, values[0]); } } 这样是可以的,但是总觉得这样不是好的方式,因为太多的相似代码了,但是又苦于不知道如何处理。如果能方便,希望可以提供思路,谢谢大家!
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

你要找的是不是Array.newInstance()

import java.lang.reflect.Array;

...
params = Array.newInstance(clazz, values.length);
...
查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 426 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信