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 Call
或Wrong Call
输出.
我需要确保每次放置"foo"
密钥时,都必须调用Foo()
方法,而不是Boo()
.
显然,它并没有缓解我的"方法调用"问题.我怎样才能克服这个问题?我每次都必须调用正确的方法.我对这些反思很新,有什么我不应该做的,或者我做错了什么?或者有更好的方法来实现此方法调用?
编辑:我也试过LinkedHashMap
,但结果是一样的.
谢谢.
来自javadoc Class.getMethods()
:
返回的数组中的元素没有排序,也没有任何特定的顺序.
但是,您的代码假定索引0处的元素是方法Foo()
.不要做这个假设.找到具有该名称的方法Foo
.
也就是说,Reflection可能不是您正在尝试的工作的正确工具.您应该在更高的层次上解释您正在尝试做什么,以及为什么您认为使用反射是一个好主意.通常,事实并非如此.
这与将方法放在地图中无关,据我所知 - 您可以完全删除地图部分并仍然面临同样的问题:
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")
获取方法.