我有一个类文件,我只想获得该类中方法名称的列表并将其打印到/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
, test2
和test3
,并且您希望按此顺序执行它们,则可以使用以下步骤:
- 从类中获取所有方法(您已经正确地使用
Method[] allMethods = Test1.getMethods();
) - 循环遍历它们并将所有以"test"开头的保存在单独的列表中
- 使用自定义排序对该列表进行排序,以按方法名称对单独列表中的方法进行排序。(请看这里的例子)
- 调用,执行
但是,它需要三个循环(或一些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