论坛首页 Java企业应用论坛

可恶的基本类型和包装类型

浏览 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;
				}
			}

 有知道更好办法的童鞋请告知我,不胜感激

   发表时间: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
1 请登录后投票
   发表时间: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是为了更高效.谢了.
0 请登录后投票
   发表时间:2010-06-12  
sf 上有个项目 :   ezmorph 是专门做这个的,那个jsonlib里也用了这个库。
它转换的类型比较多。可以看看。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2010-06-12  
你把参数都改成对象类就好了啊~~既然都反射了,还在乎这点额外消耗吗?
0 请登录后投票
   发表时间:2010-06-12  
谢楼上各位了.因为我这个需求比较简单,所以仅仅用map包装下基本类型和包装类型的对应,使用时获取就可以了.不过楼上的代码还是很不错的,学习了
0 请登录后投票
   发表时间:2010-06-12  
int.class 和Integer.class是不同的
0 请登录后投票
   发表时间:2010-06-13  
自己没弄懂java就说java可恶,这算不算自大,要是你觉得java这个不爽,你完全可以自己弄一个jdk!!
0 请登录后投票
   发表时间:2010-06-13  
kjj 写道
自己没弄懂java就说java可恶,这算不算自大,要是你觉得java这个不爽,你完全可以自己弄一个jdk!!

果然这么多年了,大帽子还是无处不在的.你没看懂就算了,java我自问虽然不是很精通,这点还是知道的.我使用不爽抱怨几句还是可以的吧,而且放在这里是为了让将要这样使用的同学注意点而已.没必要上升到这样的高度吧.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics