我有一个类文件,我只想获取该类中方法名称的列表并将其打印到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
答案 0 :(得分:1)
来自JavaDoc的引用:"返回数组中的元素没有排序,也没有按任何特定顺序排列。"。
首先,在项目中尽可能避免反射总是最好的。大部分时间它用于测试目的,或者如果没有其他方法。话虽如此,如果您的方法确实被称为test1
,test2
和test3
,并且您希望按此顺序执行它们,则可以使用以下步骤:
Method[] allMethods = Test1.getMethods();
正确完成此操作)但是,它需要三个循环(或一些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