是反射,按顺序执行方法



我有一个类文件,我只想获得该类中方法名称的列表并将其打印到/p控制台。

假设Test1类

中有以下方法
public class Test1{
public static void test1()
{
//some code
}
public static void test2()
{
//some code
}
public static void test3()
{
//some code here.
}
}

我只需要按照特定的顺序从另一个类调用上述所有方法。

首先是test1(),然后是test2(),然后是test3();

我所做的就像我刚刚创建的

 Method[] methodarray=Test1.getMethods();
    if(methodarray.getName().startWith("test"))
    {
    sysout(methodarray.getName())
    }

上面的代码第一次以特定的顺序打印方法,但并不总是这样。有时它会先打印第3个方法,然后再打印第1个方法,最后打印第2个方法。

有谁能告诉我原因吗?,如何解决?

-Sasi

引用自JavaDoc: "返回数组中的元素没有排序,也没有任何特定的顺序。".

首先,在项目中尽可能避免反射总是最好的。大多数情况下,它用于测试目的,或者如果确实没有其他方法。话虽如此,如果您的方法确实被称为test1, test2test3,并且您希望按此顺序执行它们,则可以使用以下步骤:

  1. 从类中获取所有方法(您已经正确地使用Method[] allMethods = Test1.getMethods();)
  2. 循环遍历它们并将所有以"test"开头的保存在单独的列表中
  3. 使用自定义排序对该列表进行排序,以按方法名称对单独列表中的方法进行排序。(请看这里的例子)
  4. 调用,执行

但是,它需要三个循环(或一些Java 8+ linq查询),并且它不会使代码对任何人(包括您自己)都很清楚。最好是手动一个一个地执行它们,即:

public void someMethod(){
    Test1.test1();
    Test1.test2();
    Test1.test3();
}

这就是我的2c。从这个问题来看,不清楚这些方法的目的是什么,也不清楚是否有三个以上的方法。我建议你尽量避免反射,除非你实在没有别的办法。

您可以在javadoc中读取getDeclaredMethods(),返回的Method[]没有遵循特定的顺序。

您可以通过使用LinkedHashMap或任何其他维护元素顺序的Map实现轻松地对方法进行排序。例如:

public class MethodTest {
    private LinkedHashMap<String, Method> expectedMethodsInOrder;
    void testOne(){
    }
    void testEight(){
    }
    void beforeEight(){
    }
    @Before
    public void prepareMap(){
        expectedMethodsInOrder = new LinkedHashMap<>();
        expectedMethodsInOrder.put("testOne", null);
        expectedMethodsInOrder.put("beforeEight", null);
        expectedMethodsInOrder.put("testEight", null);
    }
    @Test
    public void test(){
        Method[] methods = MethodTest.class.getDeclaredMethods();
        for(Method m : methods){
            String name = m.getName();
            if(expectedMethodsInOrder.containsKey(name)){
                expectedMethodsInOrder.put(name, m);
            }
        }
        System.out.println(expectedMethodsInOrder.values().toString());
    }
}
输出:

[void Main.testOne(), void Main.beforeEight(), void Main.testEight()]

在Windows 7中正常工作,但在Windows 8中不正常。我在两个环境(如JAVA JDK7和Eclipse IDE JEE构建)上都有相同的设置。但反射返回的方法在各自的类文件中提到。但在Windows 8中不是这样。似乎是环境问题。

我只是想更新我观察到的东西。如果还有其他根本原因,请纠正我。

-Sasi

相关内容

  • 没有找到相关文章