目标很简单,我想创建一个动态加载类,访问其方法并传递其参数值并在运行时获取返回值的方法。
将被称为
的类class MyClass {
public String sayHello() {
return "Hello";
}
public String sayGoodbye() {
return "Goodbye";
}
public String saySomething(String word){
return word;
}
}
主类
public class Main {
public void loadClass() {
try {
Class myclass = Class.forName(getClassName());
//Use reflection to list methods and invoke them
Method[] methods = myclass.getMethods();
Object object = myclass.newInstance();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("saySome")) {
String word = "hello world";
//**TODO CALL OBJECT METHOD AND PASS ITS PARAMETER**
} else if (methods[i].getName().startsWith("say")) {
//call method
System.out.println(methods[i].invoke(object));
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private String getClassName() {
//Do appropriate stuff here to find out the classname
return "com.main.MyClass";
}
public static void main(String[] args) throws Exception {
new Main().loadClass();
}
}
我的问题是如何使用参数调用方法并传递其值?也获得了返回值及其类型。
答案 0 :(得分:3)
我认为你只是错过了这样一个事实:你可以将invoke
作为Object[]
传递给Object result = methods[i].invoke(object, new Object[] { word });
:
Object result = methods[i].invoke(object, word);
如果您愿意,可以使用varargs:
{{1}}
(以上两个电话相同。)
有关详细信息,请参阅Method.invoke
的文档。
答案 1 :(得分:1)
简单地创建MyClass
的对象,像这样调用函数
MyClass mc = new MyClass();
String word = "hello world";
String returnValue = mc.saySomething(word);
System.out.println(returnValue);//return hello world here
或者这样做
Class myclass = Class.forName(getClassName());
Method mth = myclass.getDeclaredMethod(methodName, params);
Object obj = myclass.newInstance();
String result = (String)mth.invoke(obj, args);
答案 2 :(得分:0)
尝试::
Class c = Class.forName(className);
Method m = c.getDeclaredMethod(methodName, params);
Object i = c.newInstance();
String result = (String)m.invoke(i, args);