【问题标题】:Using reflection to call random methods [duplicate]使用反射调用随机方法[重复]
【发布时间】:2013-02-20 01:57:33
【问题描述】:

我有不同类型的方法的 java 类。调用某些方法不需要参数。有些方法采用 1 个字符串参数,有些采用 1 个字符串、1 个 int 参数等。我的观点是,正如我在开始时所说的那样,有不同类型的方法。为了便于理解,我在上面放了一个虚拟类。

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

    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);

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    这应该可以工作

        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]);
        }
    

    【讨论】:

    • 但是,如果我不知道被调用方法的顺序怎么办?正如我所提到的,有许多方法和许多类。在这种情况下,您不是“随机”调用方法。还是谢谢。
    • 嗯,我手动创建方法和参数,这是真的。但是方法是随机调用的,m是0到2之间的随机索引
    • 哦,等等。对不起我的第一个答案。我刚刚意识到你正在做我真正需要的!谢谢!
    【解决方案2】:

    您可以使用以下方法获取类的方法列表:

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

    然后只需使用 Random 类(随机)获取要调用的方法的索引,并从数组中获取

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多