2013-03-05 44 views
0

我有不同种类的方法的java类。不需要参数来调用某些方法。有些方法需要1个字符串参数,有些则需要1个字符串,1个int params等等。我的观点是,我有一些不同的方法,就像我在开头讲的那样。我在上面放了一个虚拟类,以便更容易理解。使用反射来调用随机方法

如果我有包/类/方法名称和带反射的参数,是否可以调用随机方法?

package dummyPackage; 

    public class DummyClass 
    { 
     public DummyClass() { 
     super(); 
     // TODO Auto-generated constructor stub 
     } 

     public void foo() { 
      System.out.println("foo called"); 
     } 

     public void bar(int sth) { 
      System.out.println(sth++); 
     } 

     public void doSth(int a,String b) { 
      System.out.println(a + "|" + b); 
     } 
... 
    } 

下面显示我需要什么。我对Java很陌生,不知道如何解决这个问题。

Object noparams[] = {}; 

Object[] params1 = new Object[1]; 
params1[0] = 100; 

Object[] params2 = new Object[2]; 
params2[0] = 200; 
params2[1] = "Test"; 

//What I need 
NeededClass.reflect("dummyPackage.dummyClass.foo",noparams); 
NeededClass.reflect("dummyPackage.dummyClass.bar",params1); 
NeededClass.reflect("dummyPackage.dummyClass.doSth",params2); 
+0

你试过了什么? – Apurv 2013-03-05 15:29:21

回答

2

这应该工作

Object[][] params = {{}, 
         {1}, 
         {1, "xxx"}}; 
    Method[] methods = {DummyClass.class.getMethod("foo"), 
         DummyClass.class.getMethod("bar", int.class), 
         DummyClass.class.getMethod("doSth", int.class, String.class)}; 
    for(int i = 0; i < 100; i++) { 
     int m = new Random().nextInt(3); 
     methods[m].invoke(new DummyClass(), params[m]); 
    } 
+0

但是,如果我不知道所谓的方法的顺序呢?正如我所提到的,有许多类的许多方法。在这种情况下,你不是“随机地”调用方法。不管怎么说,还是要谢谢你。 – meaninglessdisplayname 2013-03-05 15:50:52

+0

那么,我手动创建方法和参数,这是真的。但方法是随机调用的,m是0到2之间的随机索引。 – 2013-03-05 16:02:23

+0

哦,等等。对不起,我的第一个答案。我只是意识到你正在做我真正需要的东西!谢谢! – meaninglessdisplayname 2013-03-06 08:58:36

1

可以使用得到的类的方法列表:

Method[] methods = DummyClass.class.getDeclaredMethods(); 

然后,只需使用随机类来获取方法的索引你想打电话(随机),并从阵列中得到它

int i = Random.nextInt(methods.length); 
Method method = methods[i]; 

然后获取该方法的参数列表并用它来调用它

Class<?>[] params = method.getParameterTypes();