黑马程序员技术交流社区

标题: java反射疑问 [打印本页]

作者: 郭强    时间: 2013-4-28 16:11
标题: java反射疑问
本帖最后由 郭强 于 2013-4-28 20:17 编辑

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


public void add(String str,int x){
     System.out.println(str+x);
} 上面的函数,通过反射获Method对象后,怎么通过其参数类型,传递参数并调用啊?(假设调用者不知道这个函数的参数类型),完全通过反射得到参数类型,然后根据参数类型去构造实参调用
作者: 刘胜寒    时间: 2013-4-28 16:16
假设调用者不知道这个函数的参数类型...
你不知道这个函数的参数类型。。。
那你怎么通过反射获取这个Method对象呢....

难道是我没理解你意思..
作者: cowthan    时间: 2013-4-28 16:29
Method m = yourObj.getMethod("add");
Class[] ps = m.getParameterTypes()就可以获取add方法的参数个数和参数类型
//拿到之后构造出参数:Object[] params = new Object[]{"地球很危险", 23};
调用时就是:m.invoke(myObj, params)    //相当于调用了myObj.add("地球很危险", 23)
作者: 肖宇宥    时间: 2013-4-28 17:35
  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. }
复制代码

作者: 郭强    时间: 2013-4-28 20:10
这个不错,又回顾了Java5新特性




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2