类A
的每个实例都有一个类B
的实例。A
应该根据其成员变量method_num
调用B
中的不同方法。这是一个实现,做我想要的:
public class A {
private B myB = new B();
public int method_num = 1;
public callBMethod() {
if ( method_num == 1 )
myB.method1();
else
myB.method2();
}
}
public class B {
public method1() { }
public method2() { }
}
但是,我希望能够以某种方式直接传递B的方法1或方法2,而不是执行myA.method_num=1。我怎么能那样做?
我认为你可以像这样使用反射:
java.lang.reflect.Method method;
try {
method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) {
// ...
} catch (NoSuchMethodException e) {
// ...
}
try {
method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) { //do proper handling
} catch (IllegalAccessException e) {//do proper handling
} catch (InvocationTargetException e) {//do proper handling
你不能。Java没有将函数视为第一类对象,因为它没有Python或C#等功能特性。
您可以创建命令界面并传递该对象引用:
public interface Command {
void execute(Object [] args);
}
如果您不想使用反射(这是一个很好的目标),那么enum
s中有一些简洁的功能,允许您将enum
设置为代理。
public class A {
private B myB = new B();
public int method_num = 1;
public void callBMethod() {
// Could do it by name.
BMethods.valueOf("method1").call(myB);
// Or by number.
BMethods.values()[method_num].call(myB);
}
}
enum BMethods{
method1 {
@Override
public void call(B b) {
b.method1();
}
},
method2 {
@Override
public void call(B b) {
b.method2();
}
};
public abstract void call (B b);
}
public class B {
public void method1() {
}
public void method2() {
}
}
问题内容: 如何通过反射找出方法的字符串名称是什么? 例如给出: 我想获取字符串“ getFoo”,如下所示: 问题答案: 由于方法本身不是对象,因此它们没有直接的属性(就像您希望使用JavaScript之类的一流函数那样)。 您能做的最接近的是致电 是一个对象,您可以使用它调用任何反射方法。 但是,据我所知,一种方法无法识别自己。
问题内容: 如果我有两个变量: 在不知道的类的情况下obj,如何调用由其标识的方法methodName? 被调用的方法没有参数,并且有String返回值。 问题答案: 参数标识你需要的非常特定的方法(如果有多个重载可用,如果该方法没有参数,则仅给出methodName)。 然后,你通过调用该方法 同样,.invoke如果没有,请忽略中的参数。
问题内容: 示例代码: 现在,说我想让用户输入一个字符串: 然后,说出用户输入。我将如何检索命名的变量并对其进行处理?像这样: 我抬头看了一些东西,却没发现太多。我确实找到了对“反射API”的引用,但是对于这一简单任务而言,它似乎太复杂了。 有没有办法做到这一点,如果是的话,那是什么?如果“反射”确实有效并且是唯一的方法,那么我将如何使用它来做到这一点?它的教程页面包含了各种我无法理解的内部内容。
问题内容: 我有一个元组,列出了像这样的类的方法: 等等.. 现在,我需要根据用户做出的选择动态调用这些方法。该方法将基于索引被调用。因此,如果用户选择“ 0”,则称为,如果“ 5”,则称为。 我这样做的方法如下: 我设法解决了一些问题,但是会产生错误并且一点也不优雅。 问题答案: 如果要在对象(包括导入的模块)上调用方法,则可以使用: 例如: 如果您需要在当前模块中调用函数 要发送的参数列表或元
问题内容: 我有一个str对象,例如:。我想从此字符串运行安装方法。例如,当我打电话时它将呼叫。有什么办法吗? 问题答案: 如果在课程中,则可以使用getattr: 或者它是一个函数:
问题内容: 我有一个包含变量名称的字符串。我想获取该变量的值。 是否有可能访问该值使用? 问题答案: 我建议您改用: 通过执行操作创建地图 然后改变 至 并使用访问值