如果有两个变量:
Object obj;
String methodName = "getName";
在不知道obj的类的情况下,我如何调用由methodName识别的方法?
被调用的方法没有参数,只有一个String返回值。它是Java bean的getter。
如果有两个变量:
Object obj;
String methodName = "getName";
在不知道obj的类的情况下,我如何调用由methodName识别的方法?
被调用的方法没有参数,只有一个String返回值。它是Java bean的getter。
当前回答
Object obj;
Method method = obj.getClass().getMethod("methodName", null);
method.invoke(obj, null);
其他回答
对于jooR,它仅仅是:
on(obj).call(methodName /*params*/).get()
这里有一个更详细的例子:
public class TestClass {
public int add(int a, int b) { return a + b; }
private int mul(int a, int b) { return a * b; }
static int sub(int a, int b) { return a - b; }
}
import static org.joor.Reflect.*;
public class JoorTest {
public static void main(String[] args) {
int add = on(new TestClass()).call("add", 1, 2).get(); // public
int mul = on(new TestClass()).call("mul", 3, 4).get(); // private
int sub = on(TestClass.class).call("sub", 6, 5).get(); // static
System.out.println(add + ", " + mul + ", " + sub);
}
}
这个打印:
3, 12, 1
如果多次调用,则可以使用Java 7中引入的新方法句柄。现在我们开始你的方法返回一个字符串:
Object obj = new Point( 100, 200 );
String methodName = "toString";
Class<String> resultType = String.class;
MethodType mt = MethodType.methodType( resultType );
MethodHandle methodHandle = MethodHandles.lookup().findVirtual( obj.getClass(), methodName, mt );
String result = resultType.cast( methodHandle.invoke( obj ) );
System.out.println( result ); // java.awt.Point[x=100,y=200]
从反射使用方法调用:
Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);
地点:
“class name”是类的名称 objectToInvokeOn类型为Object,是您希望在其上调用方法的对象 "method name"是你想要调用的方法的名称 parameterTypes的类型是Class[],声明方法所接受的参数 params类型为Object[],声明要传递给方法的参数
假设您从同一个类中的一个静态方法调用一个静态方法。为此,您可以对以下代码进行示例。
class MainClass
{
public static int foo()
{
return 123;
}
public static void main(String[] args)
{
Method method = MainClass.class.getMethod("foo");
int result = (int) method.invoke(null); // answer evaluates to 123
}
}
为了解释一下,因为我们在这里不打算执行真正的面向对象编程,因此避免创建不必要的对象,所以我们将利用class属性来调用getMethod()。
然后,我们将为invoke()方法传入null,因为我们没有对象来执行此操作。
最后,因为我们程序员,知道我们期待的是一个整数,那么 我们显式地将invoke()调用的返回值转换为一个整数。
现在您可能想知道:“用Java进行所有这些非面向对象的编程到底有什么意义?”
我的用例是用Java解决Project Euler问题。我有一个包含所有解决方案的Java源文件,我想传入命令行参数,以确定要运行哪个Project Euler问题。
Method method = someVariable.class.getMethod(SomeClass);
String status = (String) method.invoke(method);
SomeClass是类,somvariable是变量。