反射是否按顺序执行方法?

Is reflection execute the method in sequence order?

我有一个 class 文件,我只想获取其中的方法名称列表 class 并打印它 o/p 控制台。

假设我在 Test1 中有以下方法 class

public class Test1{

public static void test1()
{
//some code
}

public static void test2()
{
//some code
}

public static void test3()
{
//some code here.
}
}

我只需要按特定顺序从另一个class调用上述所有方法即可。

首先喜欢 test1(),然后喜欢 test2(),然后喜欢 test3();

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

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

上面的代码第一次按特定顺序打印方法,但并非总是如此。有时它首先打印第 3 种方法,然后打印 1 种方法,最后打印 2 种方法。

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

-萨西

引自JavaDoc:"The elements in the returned array are not sorted and are not in any particular order."。

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

  1. 获取 class 中的所有方法(您已使用 Method[] allMethods = Test1.getMethods(); 正确完成)
  2. 遍历它们并将所有以 "test" 开头的内容保存在单独的列表中
  3. 使用自定义排序对该列表进行排序,以按方法名称对单独列表的方法进行排序。 (See here for an example.)
  4. 调用并执行它们

仍然,它需要三个循环(或一些 Java 8+ LINQ 查询)并且它不会使代码对任何人来说都非常清晰,包括你自己。最好手动一一执行,即:

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

那只是我的 2c。从这个问题来看,不清楚这些方法的目的是什么,或者是否有三个以上。我建议远离反射,除非你真的没有别的办法。

正如您在 getDeclaredMethods() 的 javadoc 中所读到的,返回的 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建造。但是反射 returns 该方法在各自的 class 文件中提到。但是在Windows 8. 好像是环境问题

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

-萨西