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

时间:2015-08-31 13:59:50

标签: java reflection

我有一个类文件,我只想获取该类中方法名称的列表并将其打印到o / 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

3 个答案:

答案 0 :(得分:1)

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

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

  1. 从课程中获取所有方法(您已使用Method[] allMethods = Test1.getMethods();正确完成此操作)
  2. 循环浏览并保存以" test"开头的所有内容。在单独的名单中
  3. 使用自定义排序对该列表进行排序,以按Method-Name对单独列表的方法进行排序。 (See here for an example.
  4. 调用&执行它们
  5. 但是,它需要三个循环(或一些Java 8+ LINQ查询)并且它不会使代码对任何人都很清楚,包括你自己。最好一个一个地手动执行它们,即:

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

    那只是我的2c。从问题来看,不清楚方法的目的是什么,或者是否超过三个。除非你真的没别办,否则我建议远离反思。

答案 1 :(得分:1)

正如您在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()]

答案 2 :(得分:0)

它在Windows 7中按预期工作,但在Windows 8中没有。我在两个环境中都有相同的设置,例如JAVA JDK7和Eclipse IDE JEE构建。但是反射会返回相应类文件中提到的方法。但不是在Windows 8中。这似乎是环境问题。

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

-Sasi