如何使用变量名调用java方法?

Ada*_*ler 25 java variables methods

假设我有Method1(void),Method2(void)......

有没有办法可以选择其中一个变量?

 String MyVar=2;
 MethodMyVar();
Run Code Online (Sandbox Code Playgroud)

Nat*_*hes 36

使用反射:

Method method = WhateverYourClassIs.class.getDeclaredMethod("Method" + MyVar);
method.invoke();
Run Code Online (Sandbox Code Playgroud)


Tod*_*odd 9

只有通过反思.看java.lang.reflect包装.

你可以尝试类似的东西:

Method m = obj.getClass().getMethod("methodName" + MyVar);
m.invoke(obj);
Run Code Online (Sandbox Code Playgroud)

如果方法具有参数并且缺少各种异常处理,则代码可能会有所不同.

但问问自己这是否真的有必要?可以对您的设计进行更改以避免这种情况.反射代码很难理解,并且比调用慢obj.someMethod().

祝好运.快乐的编码.


小智 7

您可以使用策略设计模式以及从您拥有的字符串到相应的具体策略对象的映射.这是安全有效的手段.

所以,请HashMap<String,SomeInterfaceYouWantToInvokeSuchAsRunnableWithPseudoClosures>查看.

例如,有些东西:

final static YourType reciever = this;
HashMap<String,Runnable> m = new HashMap<String,Runnable> {{
    put("a", new Runnable() {
       @Override public void run () {
         reciever.a();
       }
    });
    ....
}};
// but check for range validity, etc.
m.get("a").run()
Run Code Online (Sandbox Code Playgroud)

您也可以使用反射或"反转"问题并使用多态

  • 我将 `override` 更正为 Java 的 `@Override`,但这真的没有必要。在某些相关情况下,枚举也可能有用。反思当然是邪恶的。 (2认同)
  • @Fleep 是的,自从我问这个问题以来,编码四年后,我肯定已经意识到为什么它被认为是邪恶的哈哈 (2认同)