反射是否按顺序执行方法?
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."。
首先,最好在项目中尽可能避免反射。大多数时候它用于测试目的,或者如果真的没有其他方法。也就是说,如果您的方法确实被称为 test1
、test2
和 test3
并且您希望按此顺序执行它们,则可以使用以下步骤:
- 获取 class 中的所有方法(您已使用
Method[] allMethods = Test1.getMethods();
正确完成)
- 遍历它们并将所有以 "test" 开头的内容保存在单独的列表中
- 使用自定义排序对该列表进行排序,以按方法名称对单独列表的方法进行排序。 (See here for an example.)
- 调用并执行它们
仍然,它需要三个循环(或一些 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. 好像是环境问题
我只想更新我观察到的东西。如果还有其他根本原因,请指正。
-萨西
我有一个 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."。
首先,最好在项目中尽可能避免反射。大多数时候它用于测试目的,或者如果真的没有其他方法。也就是说,如果您的方法确实被称为 test1
、test2
和 test3
并且您希望按此顺序执行它们,则可以使用以下步骤:
- 获取 class 中的所有方法(您已使用
Method[] allMethods = Test1.getMethods();
正确完成) - 遍历它们并将所有以 "test" 开头的内容保存在单独的列表中
- 使用自定义排序对该列表进行排序,以按方法名称对单独列表的方法进行排序。 (See here for an example.)
- 调用并执行它们
仍然,它需要三个循环(或一些 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. 好像是环境问题
我只想更新我观察到的东西。如果还有其他根本原因,请指正。
-萨西