- 浏览: 94753 次
- 性别:
- 来自: 厦门
最新评论
-
lirui_andy:
Hi, 两年后的今天我也遇到类似问题, 百度把我引到你这里来了 ...
多个工程中,关于公共资源【js,css】等版本控制的问题 -
MrCrapBag:
/** * In order for SSH2 tunnel ...
使用jsch实现文件上传 -
jn_nian:
无法做到要上传的文件包含完整的路径,在各个浏览器里都不一样
使用jsch实现文件上传 -
aimer311:
ouspec 写道把提问帖子放到问答频道,一个重要的原因,大部 ...
在问答频道发了个帖子太久没人理? -
aimer311:
ouspec 写道把提问帖子放到问答频道,一个重要的原因,大部 ...
在问答频道发了个帖子太久没人理?
package demo.test; import java.lang.reflect.Method; /** * Java Reflection Cookbook<br/> * eg:<br/> * Reflection r = new Reflection(A.class);<br/> * Reflection r = new Reflection("com.ehi.A");<br/> */ @SuppressWarnings("unchecked") public class Reflection { private Class clazz; private Object object; private Reflection() { } /** * construct method * @param obj */ public Reflection(Object obj) { this.object = obj; clazz = obj.getClass(); } /** * construct method * @param className * @throws Exception */ public Reflection(String className) throws Exception { if (className == null) clazz = null; else clazz = Class.forName(className); this.object = clazz.newInstance(); } /** * 根据方法名,参数,查找对应的方法,并执行 * * @param methodName * 方法名 * @param args * 参数 * @return 方法返回值 * @throws Exception */ public Object invoke(String methodName, Object[] args) throws Exception { Class[] parameterTypes = getParameterTypes(args); Method method = clazz.getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); return method.invoke(object, args); } private Class[] getParameterTypes(Object[] args) throws Exception { if(args == null){ return null; } Class[] parameterTypes = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { if(args[i] instanceof Integer){ parameterTypes[i] = Integer.TYPE; }else if(args[i] instanceof Byte){ parameterTypes[i] = Byte.TYPE; }else if(args[i] instanceof Short){ parameterTypes[i] = Short.TYPE; }else if(args[i] instanceof Float){ parameterTypes[i] = Float.TYPE; }else if(args[i] instanceof Double){ parameterTypes[i] = Double.TYPE; }else if(args[i] instanceof Character){ parameterTypes[i] = Character.TYPE; }else if(args[i] instanceof Long){ parameterTypes[i] = Long.TYPE; }else if(args[i] instanceof Boolean){ parameterTypes[i] = Boolean.TYPE; }else{ parameterTypes[i] = args[i].getClass(); } } return parameterTypes; } public void print(Integer i){ System.out.println("Integer: "+i.intValue()); } public void print(int i){ System.out.println("int: "+i); } public static boolean isWrapClass(Class clz) { try { return ((Class) clz.getField("TYPE").get(null)).isPrimitive(); } catch (Exception e) { return false; } } public static void main(String[] args) throws Exception { Reflection r = new Reflection(new Reflection()); Object[] obj = new Object[1]; int i = 333; obj[0] = i; //Integer I = new Integer(333); //obj[0] = I; r.invoke("print", obj); } }
invoke要实现的是根据方法名和输入的参数自动查找对应的方法,并执行之。遇到的问题就是如何区分Object[]里面存储的是一个基本类型还是其对应的包装类?或者这样的思路根本就是有问题的,请提供下其他的思路。
评论
3 楼
realorg
2008-11-27
请问 JDK1.4 里能这么做么?
2 楼
aimer311
2008-10-10
当程序执行到如下时:
int i = 333;
obj[0] = i; 内存实际上存储的是一个Integer对象。
也就是说当把i存储到数组后就已经是一个Integer的对象了,那么以后就没办法知道它具体是从对象定义而来还是具体类型而来了。
所以我在想除非在传入的参数中必须包含它具体定义类型的信息。
如:
定义的是int i = 333;那么加上类型信息int.class
定义的是Integer I = 333,那么加上类型信息Integer.class.
这样是比较麻烦一点。
当调用的函数包含有基本类型的包装类时,那么必须传入参数的具体类型,否则不需要。因为传入包装类的情况比较少,当然也可以判断当传入的是基本类型是必须加上类型信息。根据上面的想法修改后的程序如下:
int i = 333;
obj[0] = i; 内存实际上存储的是一个Integer对象。
也就是说当把i存储到数组后就已经是一个Integer的对象了,那么以后就没办法知道它具体是从对象定义而来还是具体类型而来了。
所以我在想除非在传入的参数中必须包含它具体定义类型的信息。
如:
定义的是int i = 333;那么加上类型信息int.class
定义的是Integer I = 333,那么加上类型信息Integer.class.
这样是比较麻烦一点。
当调用的函数包含有基本类型的包装类时,那么必须传入参数的具体类型,否则不需要。因为传入包装类的情况比较少,当然也可以判断当传入的是基本类型是必须加上类型信息。根据上面的想法修改后的程序如下:
package demo.test; import java.lang.reflect.Method; /** * Java Reflection Cookbook<br/> * eg:<br/> * Reflection r = new Reflection(A.class);<br/> * Reflection r = new Reflection("com.ehi.A");<br/> */ @SuppressWarnings("unchecked") public class Reflection { private Class clazz; private Object object; private Reflection() { } /** * construct method * @param obj */ public Reflection(Object obj) { this.object = obj; clazz = obj.getClass(); } /** * construct method * @param className * @throws Exception */ public Reflection(String className) throws Exception { if (className == null) clazz = null; else clazz = Class.forName(className); this.object = clazz.newInstance(); } /** * 执行对象方法 * 当所执行的函数的参数包含基本类型的包装类是,必须为所有参数定义其参数类型 * @param methodName * 方法名 * @param args * 参数 * @param types * 当函数的参数包含基本类型的包装类时,此参数包含所以参数的类型信息 * @return 方法返回值 * @throws Exception */ public Object invoke(String methodName, Object[] args, Class[] types) throws Exception { Class[] parameterTypes = null; if(types == null) parameterTypes = getParameterTypes(args); else parameterTypes = types; Method method = clazz.getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); return method.invoke(object, args); } private Class[] getParameterTypes(Object[] args) throws Exception { if(args == null){ return null; } Class[] parameterTypes = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { if(args[i] instanceof Integer){ parameterTypes[i] = Integer.TYPE; }else if(args[i] instanceof Byte){ parameterTypes[i] = Byte.TYPE; }else if(args[i] instanceof Short){ parameterTypes[i] = Short.TYPE; }else if(args[i] instanceof Float){ parameterTypes[i] = Float.TYPE; }else if(args[i] instanceof Double){ parameterTypes[i] = Double.TYPE; }else if(args[i] instanceof Character){ parameterTypes[i] = Character.TYPE; }else if(args[i] instanceof Long){ parameterTypes[i] = Long.TYPE; }else if(args[i] instanceof Boolean){ parameterTypes[i] = Boolean.TYPE; }else{ parameterTypes[i] = args[i].getClass(); } } return parameterTypes; } public void print(Integer i, int j){ System.out.println("Integer: "+i.intValue()); System.out.println("int: "+j); } public void print(int i){ System.out.println("int: "+i); } public static boolean isWrapClass(Class clz) { try { return ((Class) clz.getField("TYPE").get(null)).isPrimitive(); } catch (Exception e) { return false; } } public static void main(String[] args) throws Exception { Reflection r = new Reflection(new Reflection()); Object[] obj = new Object[2]; Integer I = new Integer(333); obj[0] = I; obj[1] = 444; Class[] clazz = new Class[2]; clazz[0] = Integer.class; clazz[1] = int.class; r.invoke("print", obj, clazz); } }
1 楼
aimer311
2008-10-09
按照以上的程序并不能调用print(Integer i).当然,我知道通过
Method method = clazz.getDeclaredMethod("print", int.class);
Method method = clazz.getDeclaredMethod("print", Integer.class);可以区分这两个函数,这样相当于实现知道参数类型。而如果从所输入的参数来判断是什么类型,再判断调用哪个函数就不清楚了。如:
当obj[0] = 333,表明此时的参数是int型,那么调用的应该是print(int i);
当obj[0] = new Integer(333),表明此时的参数是Integer型,那么调用的应该是print(Integer i);
Method method = clazz.getDeclaredMethod("print", int.class);
Method method = clazz.getDeclaredMethod("print", Integer.class);可以区分这两个函数,这样相当于实现知道参数类型。而如果从所输入的参数来判断是什么类型,再判断调用哪个函数就不清楚了。如:
当obj[0] = 333,表明此时的参数是int型,那么调用的应该是print(int i);
当obj[0] = new Integer(333),表明此时的参数是Integer型,那么调用的应该是print(Integer i);
发表评论
-
多个工程中,关于公共资源【js,css】等版本控制的问题
2012-04-25 10:47 3927目前有个公共资源的resource project,其 ... -
Websphere卸载后重新安装时检测到安装还存在
2009-11-19 18:25 1943做个备忘: http://www-01.ibm.com/sup ... -
ibatis分页实现
2009-09-01 15:39 4152上次写了关于ibatis处理s ... -
浏览器url编码
2009-07-28 15:03 2184方式一:使用ajax get提交 function add ... -
There is no space available in SYSLOGS to log a record for which space has been
2009-07-23 20:28 1830第一步,启用allow updates ... -
sybase乱码以及bcp导入问题
2009-07-13 16:05 53601. JDBC连接串要有字符集设置 jdbc:syba ... -
System.getProperty()参数大全
2009-03-23 10:43 1042java.version Java Runtime ... -
使用jsch实现文件上传
2009-03-21 16:52 10676仅提供代码作为参考, import java.io.File; ... -
java调用shell命令,备忘
2009-03-12 10:54 5355直接看代码: String[] envp = new St ... -
sybase bcp备份
2009-02-20 17:21 27191、在dsedit中设置数据源 因为bcp命令不支持ip: ... -
jar文件中打印中文的问题
2009-01-16 15:24 1151使用jdk自带的native2ascii命令将中文转为java ... -
让Spring架构减化事务配置
2008-12-31 15:49 897http://tech.it168.com/oldarticl ... -
ibatis处理sybase分页的问题(还没有解决)续
2008-12-09 16:15 2324[size=medium] 承接上一篇 ... -
ibatis处理sybase分页的问题
2008-12-09 13:59 7083[size=medium] 这两天一直在想怎么在现有系统上比 ... -
sybase 死锁的查找思路
2008-10-30 11:11 2335参考:http://www.chinaunix.net/jh/ ... -
在drools规则条件中使用日期进行比较
2008-07-03 19:56 7861系统默认支持dd-MMM-yyyy格式. 规则条件编写如下: ... -
dom 生成xml文件的问题,请教
2008-05-19 20:31 1705用dom生成xml文件的程序如下 Element root ...
相关推荐
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...
6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 ==和equals比较运算符 172 6.3 类成员 175 6.3.1 理解类成员 175 6.3.2 单例(Singleton)类 176 6.4 final修饰符 ...
25.2 在业务代理类中访问EJB组件 25.3 发布J2EE应用 25.3.1 在JBoss上部署EJB组件 25.3.2 在JBoss上部署Web应用 25.3.3 在JBoss上部署J2EE应用 25.4 小结 附录A 标准SQL语言的用法 A.1 数据...
25.2 在业务代理类中访问EJB组件 25.3 发布J2EE应用 25.3.1 在JBoss上部署EJB组件 25.3.2 在JBoss上部署Web应用 25.3.3 在JBoss上部署J2EE应用 25.4 小结 附录A 标准SQL语言的用法 A.1 数据...
25.2 在业务代理类中访问EJB组件 25.3 发布J2EE应用 25.3.1 在JBoss上部署EJB组件 25.3.2 在JBoss上部署Web应用 25.3.3 在JBoss上部署J2EE应用 25.4 小结 附录A 标准SQL语言的用法 A.1 数据...
25.2 在业务代理类中访问EJB组件 25.3 发布J2EE应用 25.3.1 在JBoss上部署EJB组件 25.3.2 在JBoss上部署Web应用 25.3.3 在JBoss上部署J2EE应用 25.4 小结 附录A 标准SQL语言的用法 A.1 数据...
16.5.8 在单个类中创建多个迭代器 469 16.5.9 yield语句的要求 470 16.6 小结 470 第17章 反射、特性和动态编程 471 17.1 反射 471 17.1.1 使用System.Type访问元数据 472 17.1.2 成员调用...
供Asp.Net直接调用的包装类(WebPreview.cs) 计算机重启、关电源、注销、关闭显示器辅助类(WindowsExitHelper.cs) ----------NONONONO-------------- 全局统一的缓存类(Cache.cs) 常用显示日期时间、农历、生肖的...
10.4基本数据类型的包装类 10.4.1认识包装类 10.4.2通过包装类进行数据转换 10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一维集合 10.6.2使用List集合 10.6.3...
Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行...
7.3.2OutputStreamWriter类中的方法250 7.3.3从键盘输入250 7.3.4文件复制251 7.4文件属性处理252 7.4.1File类中的方法252 7.4.2File类使用示例——文件列表253 7.5随机访问文件254 7.5.1RandomAccessFile类...
3.2.1 Java中的八种基本数据类型34 3.2.2 普及二进制36 3.2.3 进制间转换37 3.2.4 基本数据类型间转换38 3.2.5 数据类型应用实例38 3.2.6 引用数据类型39 3.3 关键字.标识符.常量39 3.3.1 变量命名规范39 3.3.2 ...
22.供Asp.Net直接调用的包装类(WebPreview.cs) 23.计算机重启、关电源、注销、关闭显示器辅助类(WindowsExitHelper.cs) ----------NONONONO-------------- 1.全局统一的缓存类(Cache.cs) 2.常用显示日期时间、农历...