浏览 4472 次
锁定老帖子 主题:可恶的基本类型和包装类型
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-11
今天写程序,遇到一个通过调用类的方法改变值的案例,就写了个一个反射方法. 类为A,方法为public void setXXX(int i,float f); 调用方法为 Class<?> clazz = A.getClass(); Class<?>[] pts = new Class<?>[newArags.length]; int index = 0; for (Object o : this.newArags) { pts[index++] = o.getClass(); } try { Method m = clazz.getMethod(this.methodName, pts); m.invoke(this.owner, this.oldArgs); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } 其中oldArgs为{1,2.1f},newArgs为{1,1.0f},想法是好,但是结果很是无情: java.lang.NoSuchMethodException: A.setXXX(java.lang.Integer, java.lang.Float), 难道只能手动的把包装类型转换成基本类型吗? for (Object o : this.newArags) { Class<?> c = o.getClass(); if (c == Integer.class) { c = int.class; } else if(c == Float.class) { c = float.class; } else if (c == Double.class) { c = double.class; } } 有知道更好办法的童鞋请告知我,不胜感激 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-11
参考jbpm4里ReflectUtil的实现,里边自动对原始类型和封装类型进行转换,主要是为了在进行依赖注入时同时支持Boolean,boolean这类的问题。
svn地址: http://anonsvn.jboss.org/repos/jbpm/jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java |
|
返回顶楼 | |
发表时间:2010-06-11
xyz20003 写道 参考jbpm4里ReflectUtil的实现,里边自动对原始类型和封装类型进行转换,主要是为了在进行依赖注入时同时支持Boolean,boolean这类的问题。
svn地址: http://anonsvn.jboss.org/repos/jbpm/jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java 谢了,我大概看了下,他也是转换的,看来java自身的api是没办法自动做到了.他用map是为了更高效.谢了. |
|
返回顶楼 | |
发表时间:2010-06-12
sf 上有个项目 : ezmorph 是专门做这个的,那个jsonlib里也用了这个库。
它转换的类型比较多。可以看看。 |
|
返回顶楼 | |
发表时间:2010-06-12
最后修改:2010-06-12
我的项目也要用到类似的反射调用,因此我写了一个简单的工具类,参数表做了优化自动匹配
http://jiopi.iteye.com/blog/649996 这个是独立版,你可以拿走直接用 因为要和我的项目做更紧密集成,最新版的程序改动比较大,提供了更加友好的API org.jiopi.framework.CentralConsole 类 public static <T> T objectVariable(Object obj,String variableName,Class<T> returnType); public static <T> T objectOperate(Object obj,String registerName,Class<T> returnType,Object... args); public static <T> T objectOperateStrict(Object obj,String registerName,Class<T> returnType,Object[] parameterTypes,Object... args); obj :对象,可以是一般对象,也可以是类对象,当是类对象时,访问/调用类的静态变量/方法 详细说明参阅 http://jiopi.iteye.com/blog/655032 下载地址: http://code.google.com/p/ibean/downloads/list |
|
返回顶楼 | |
发表时间:2010-06-12
你把参数都改成对象类就好了啊~~既然都反射了,还在乎这点额外消耗吗?
|
|
返回顶楼 | |
发表时间:2010-06-12
谢楼上各位了.因为我这个需求比较简单,所以仅仅用map包装下基本类型和包装类型的对应,使用时获取就可以了.不过楼上的代码还是很不错的,学习了
|
|
返回顶楼 | |
发表时间:2010-06-12
int.class 和Integer.class是不同的
|
|
返回顶楼 | |
发表时间:2010-06-13
自己没弄懂java就说java可恶,这算不算自大,要是你觉得java这个不爽,你完全可以自己弄一个jdk!!
|
|
返回顶楼 | |
发表时间:2010-06-13
kjj 写道 自己没弄懂java就说java可恶,这算不算自大,要是你觉得java这个不爽,你完全可以自己弄一个jdk!!
果然这么多年了,大帽子还是无处不在的.你没看懂就算了,java我自问虽然不是很精通,这点还是知道的.我使用不爽抱怨几句还是可以的吧,而且放在这里是为了让将要这样使用的同学注意点而已.没必要上升到这样的高度吧. |
|
返回顶楼 | |