A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭强 中级黑马   /  2013-4-28 16:11  /  1372 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭强 于 2013-4-28 20:17 编辑

在学习Java反射时,有些疑问不解,通过反射,拿到一个字节码文件的所有public类型的方法,然后调用方法,如果是有参数的方法,怎么去构造函数所对应的类型参数?并传递参数调用函数?
如:


public void add(String str,int x){
     System.out.println(str+x);
} 上面的函数,通过反射获Method对象后,怎么通过其参数类型,传递参数并调用啊?(假设调用者不知道这个函数的参数类型),完全通过反射得到参数类型,然后根据参数类型去构造实参调用

4 个回复

倒序浏览
假设调用者不知道这个函数的参数类型...
你不知道这个函数的参数类型。。。
那你怎么通过反射获取这个Method对象呢....

难道是我没理解你意思..
回复 使用道具 举报
Method m = yourObj.getMethod("add");
Class[] ps = m.getParameterTypes()就可以获取add方法的参数个数和参数类型
//拿到之后构造出参数:Object[] params = new Object[]{"地球很危险", 23};
调用时就是:m.invoke(myObj, params)    //相当于调用了myObj.add("地球很危险", 23)
回复 使用道具 举报
  1. import java.lang.reflect.Method;

  2. public class Test {

  3.         /**
  4.          * @param args
  5.          * @throws NoSuchMethodException
  6.          * @throws SecurityException
  7.          */
  8.         public static void main(String[] args) throws Exception {
  9.                 Demo demo=new Demo();
  10.                 Class[] clazz=null;
  11.                 /*不知道参数的话,就必需得到所有的方法,在判断
  12.                  * demo.getClass().getMethod('add');这样会报错*/
  13.                 Method[] method=demo.getClass().getMethods();
  14.                 for(Method med:method){
  15.                         if(med.getName().equals("add")){
  16.                                 /*得到参数类型的集合*/
  17.                                 clazz=med.getParameterTypes();
  18.                         }
  19.                 }
  20.                 /**/
  21.                 Method add=demo.getClass().getMethod("add", clazz);
  22.                 add.invoke(demo, "hello",1);
  23.         }

  24. }

  25. class Demo{
  26.        
  27.         public void add(String str,int x){
  28.              System.out.println(str+x);
  29.         }
  30. }
复制代码
回复 使用道具 举报
这个不错,又回顾了Java5新特性
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马