好的,我确实理解Java Reflection的工作原理。但我正在做的事情与反思教程中显示的有点不同。现在我想要的是调用通过使用反射调用方法返回的方法。
class Foo{
private String str = "";
public Foo(String str){
str = this.str;
}
public void goo(){
System.out.println(this.str);
}
}
class Bar{
public Foo met(String str){
return new Foo(str);
}
}
class Hee{
public static void main(String [] args) throws Exception{
Class cls = Class.forName("Bar");
Object obj = cls.newInstance();
Class [] types = {String.class};
String [] arr = {"hello"};
Method method = cls.getMethod("met",types);
Object target = method.invoke(obj, arr);
target.goo(); //here where the error occurs
// 123456
}
}
现在,我非常依赖我的经验,我的method.invoke()
将返回由反映的方法返回的方法返回的对象。但似乎它不起作用..我调试我的代码ans似乎它没有返回任何东西。我做错了什么?如果我做错了请告诉我
答案 0 :(得分:5)
可能需要将target
对象转换为foo type
。
((foo)target).goo();
答案 1 :(得分:1)
为了在变量中调用类的方法,你应该声明该类的变量:
Foo target = (Foo) method.invoke(obj, arr); // And do some casting.
target.goo();
答案 2 :(得分:0)
好吧,除了反射中丢失的强制转换(Test class)之外,你的Foo类有一个错误。你的代码应该看起来像这样。
class Foo {
private String str = "";
public Foo(String str) {
this.str = str; //You had str=this.str;
}
public void goo() {
System.out.println(this.str);
}
}
class Bar {
public Foo met(String str) {
return new Foo(str);
}
}
class Test {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("Bar");
Bar obj = (Bar) cls.newInstance();
Class[] types = { String.class };
String[] arr = { "hello" };
Method method = cls.getMethod("met", types);
Foo target = (Foo) method.invoke(obj, arr);
target.goo();
}
}