通过Java中的反射从调用的方法调用返回方法

时间:2012-11-05 07:23:30

标签: java reflection

好的,我确实理解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似乎它没有返回任何东西。我做错了什么?如果我做错了请告诉我

3 个答案:

答案 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(); 
   }
}