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")获取方法.
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |