反射 - 从HashMap获取不同的结果 - LinkedHashMap

Bur*_*ak. 4 java reflection methods hashmap linkedhashmap

我会保持简短,我有一个Dog类如下:

public class Dog 
{
   public void Foo() 
   { 
      System.out.println("Right Call");
   }

   public void Boo()
   {
     System.out.println("Wrong Call");
   }
}
Run Code Online (Sandbox Code Playgroud)

和以下主要方法:

HashMap<String, Method> map = new HashMap<String, Method>();

Dog d = new Dog();

Method[] method = d.getClass().getMethods();

map.put("foo", method[0]);

Method a = map.get("foo");

try {
    a.invoke(d, null);
} catch (IllegalAccessException | IllegalArgumentException
        | InvocationTargetException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

每当我再次运行它时,它只是任意给出Right CallWrong Call输出.

我需要确保每次放置"foo"密钥时,都必须调用Foo()方法,而不是Boo().

显然,它并没有缓解我的"方法调用"问题.我怎样才能克服这个问题?我每次都必须调用正确的方法.我对这些反思很新,有什么我不应该做的,或者我做错了什么?或者有更好的方法来实现此方法调用?

编辑:我也试过LinkedHashMap,但结果是一样的.

谢谢.

JB *_*zet 8

来自javadoc Class.getMethods():

返回的数组中的元素没有排序,也没有任何特定的顺序.

但是,您的代码假定索引0处的元素是方法Foo().不要做这个假设.找到具有该名称的方法Foo.

也就是说,Reflection可能不是您正在尝试的工作的正确工具.您应该在更高的层次上解释您正在尝试做什么,以及为什么您认为使用反射是一个好主意.通常,事实并非如此.


Jon*_*eet 5

这与将方法放在地图中无关,据我所知 - 您可以完全删除地图部分并仍然面临同样的问题:

Dog d = new Dog();

Method methods = d.getClass().getMethods();        
Method a = methods[0];

try {
    a.invoke(d, null);
} catch (IllegalAccessException | IllegalArgumentException
        | InvocationTargetException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

从根本上说,你会看到这样一个事实,即getMethods()不按照你应该依赖的顺序从类中返回方法.如果您想要专门调用您的Foo方法(应该foo遵循Java命名约定),您可能应该使用按名称Class.getMethod("foo")获取方法.