如何使用变量名调用java方法?
假设我有方法1(无效),方法2(无效) 有没有一种方法可以让我选择一个变量如何使用变量名调用java方法?,java,variables,methods,Java,Variables,Methods,假设我有方法1(无效),方法2(无效) 有没有一种方法可以让我选择一个变量 String MyVar=2; MethodMyVar(); 使用反射: Method method = WhateverYourClassIs.class.getDeclaredMethod("Method" + MyVar); method.invoke(); 您可以使用策略设计模式和从字符串到相应具体策略对象的映射。这是安全有效的手段 因此,进行HashMap查找 例如,沿着以下路线的东西: final s
String MyVar=2;
MethodMyVar();
使用反射:
Method method = WhateverYourClassIs.class.getDeclaredMethod("Method" + MyVar);
method.invoke();
您可以使用策略设计模式和从字符串到相应具体策略对象的映射。这是安全有效的手段 因此,进行
HashMap
查找
例如,沿着以下路线的东西:
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()
final static YourType receiver=this;
HashMap m=新的HashMap{{
put(“a”,新的Runnable(){
@重写公共无效运行(){
receiver.a();
}
});
....
}};
//但检查范围有效性等。
m、 获取(“a”).run()
您还可以使用反射或“反转”问题,并仅通过反射使用多态性。请参阅
java.lang.reflect
包
您可以尝试以下方法:
Method m = obj.getClass().getMethod("methodName" + MyVar);
m.invoke(obj);
如果方法有参数并且缺少各种异常处理,那么代码可能会有所不同
但是问问你自己这是否真的有必要?可以对您的设计进行一些更改以避免这种情况。反射代码很难理解,并且比只调用obj.someMethod()
要慢
祝你好运。愉快的编码。我不确定接受的答案如何适用于
方法。invoke()
而静态方法的第一个参数为null
(尽管put dummy value仍然有效)。根据:
第一个参数是对象实例,此特定的
方法将被调用。(如果方法是静态的,则第一个参数
应为空。)
下面显示了一个完整的示例(Main.java),用于静态(按类)和非静态(按实例),以及带有参数的方法、导入必要类、捕获异常,以及超类方法示例
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
class Love {
protected void Method4() {
System.out.println("calls super protected method by instance");
}
public void Method5() {
System.out.println("calls super public method by instance");
}
}
class Main extends Love {
static void Method2(int y) {
System.out.println("by class: " + y);
}
void Method3(String y) {
System.out.println(y);
}
public static void main(String[] args) {
String MyVar = "2";
String MyAnotherVar = "3";
String MySuperVar = "4";
String MySuperPublicMethodVar = "5";
Main m = new Main();
try {
Method method = Main.class.getDeclaredMethod("Method" + MyVar, int.class); //by class
Method anotherMethod = m.getClass().getDeclaredMethod("Method" + MyAnotherVar, String.class); //by instance
Method superMethod = m.getClass().getSuperclass().getDeclaredMethod("Method" + MySuperVar); //super method by instance, can be protected
Method superPublicMethod = m.getClass().getMethod("Method" + MySuperPublicMethodVar); //getMethod() require method defined with public, so even though sublcass calls super protected method will not works
try {
method.invoke(null, 10000);//by class
anotherMethod.invoke(m, "by instance"); //by instance
superMethod.invoke(m); //super method by instance
superPublicMethod.invoke(m); //super's public method by instance
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
输出:
$ javac Main.java
$ java Main
by class: 10000
by instance
calls super protected method by instance
calls super public method by instance
$
你可以,但你为什么要这么做?我曾经遇到过这样一个案子,其中,使用反射+哈希映射比大量的if/else字符串比较和条件方法调用更有意义。@赵:当然更好的方案是编写一个接口,并使用哈希映射来存储该接口的对象,作为lambda函数的模拟。@Mark E:如果我想调用的所有方法都在同一个接口上,则不会对象使用接口意味着有一个单独的类来表示每个方法,这意味着需要一大堆类和一大堆设置工作来完成我在更少的代码中使用注释、反射和HashMap所做的更可靠的工作。除非我理解错了。“你为什么要这样做”的答案是徒劳的、粗鲁的、像苹果一样的。+1,警告反射可能会很慢,并且编译器不再强制执行类型安全。写下他的例子,这难道不应该将“Method2”视为方法吗?
method
和Class
有哪些依赖关系?我试图使用此方法,但我得到了错误:非静态方法getDeclaredMethod无法从静态上下文引用
@Hellye:这应该是一个实例方法,您必须在类上获取类对象,并在该类上调用该方法。@T.Todua:可能几十次,甚至数百次。如果你是一次性的,你不会注意到其中的区别,而且这种灵活性非常值得额外的微秒。不过,在一个紧密的循环中,这可能很重要。我将覆盖
修改为Java的@覆盖
,但这确实是不必要的。此外,枚举在某些相关情况下也可能有用。当然,反射是邪恶的。在提出这个问题之前,我只做了少量的研究,但为什么反射是邪恶的呢?对我来说,它似乎非常强大,而且它似乎可以使编写一些代码变得更容易。老实说,你上面写的是我这周看到的最酷的东西。不过,我有一个问题:您使用hashmap的方法是否比同一线程上的反射示例更好?add(“a”),…
应该是put(“a”),…
@michaelsnowden反射被认为是邪恶的,因为它可以破坏封装,并消除编译器时间检查的好处。还有其他策略,如上面提到的,可以通过更多配置实现相同的结果。尽管我承认我理解“您可以使用在类上定义的任何公共函数名”(类作为配置),它削弱了Java的一个优势。@Fleep是的,在我问这个问题4年后,我终于明白为什么它被认为是邪恶的了哈哈obj
只是我编造的一个变量名,但它是任何你想反射调用方法的对象。如何将参数传递给反射方法?方法见Javadocs