方法反映 - 调用方法序列

时间:2014-03-05 09:45:06

标签: java reflection

我正在尝试学习Method Reflect,因此我可以在我的Java应用程序中应用。

我创建了两个POJO类。

Wishes.java

public class Wishes {

    private String greeting;

    public String getGreeting() {
        this.greeting="Good Afternoon!";
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }
}

Day.java

public class Day {

    private Wishes wishes;

    public Wishes getWishes() {
        return wishes;
    }

    public void setWishes(Wishes wishes) {
        this.wishes = wishes;
    }
}

这是我在主要方法中所做的。的 DemoApp.java

public class DemoApp {
    public static void main(String[] args) {
        try {
            Class cls=Wishes.class;
            Method method1=cls.getDeclaredMethod("getGreeting");
            String result1=(String) method1.invoke(cls.newInstance());
            System.out.println(result1);
            Class clazz=Day.class;
            Method method=clazz.getDeclaredMethod("getWishes().getGreeting");
            String result=(String) method.invoke(clazz.newInstance());
            System.out.println(result);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

我运行该应用程序。对于第一个,我正在获得准确的输出,因为它是直接的。但是对于第二个我得到例外。这是控制台输出和堆栈跟踪。

Good Afternoon!
java.lang.NoSuchMethodException: com.myapp.demo.Day.getWishes().getGreeting()
    at java.lang.Class.getDeclaredMethod(Class.java:2004)
    at com.myapp.demo.DemoApp.main(DemoApp.java:17)

如何使用带有方法反映的getGreeting类从getWishes调用Day方法?可能吗?否则,方法反映的最佳方法是什么?

在我的应用程序中,我得到的方法名称来自一个XML文件。因此它可能包含单个方法或方法调用序列,如上所述。

5 个答案:

答案 0 :(得分:3)

首先在Day课程中你应该发起祝愿

private Wishes wishes = new Wishes();

第二,你需要这个:

Method method=clazz.getDeclaredMethod("getWishes");
Object result= method.invoke(clazz.newInstance());
Method method2=result.getClass().getDeclaredMethod("getGreeting");
String result2=(String) method2.invoke(cls.newInstance());
System.out.println(result2);

答案 1 :(得分:2)

方法Class#getDeclaredMethod采用方法的名称及其参数的类型。您正在处理字符串getWishes().getGreeting什么不是有效的方法名称。你想用

Method method = clazz.getDeclaredMethod("getWishes");

Wishes实例获取Day的实例应该有什么用处。对于收到的实例,您可以反复调用getGreeting方法。方法链接,因为你建议它不适用于反射。然而,有些库可以简化反射API,例如对链接属性的bean访问。但是,出于学习目的,您需要手动链接反射调用。

答案 2 :(得分:1)

不会堆叠反光通话。因此,调用方法getGreeting的方式不起作用。

您可以尝试这种方式:

        Class cls=Wishes.class;
        Method method1=cls.getDeclaredMethod("getGreeting");
        String result1=(String) method1.invoke(cls.newInstance());
        System.out.println(result1);
        Class clazz=Day.class;
        Object ob = clazz.newInstance();
        Method method2=clazz.getDeclaredMethod("setWishes", cls);
        method2.invoke(ob, cls.newInstance());
        Method method=clazz.getDeclaredMethod("getWishes");
        Object day =(Object) method.invoke(ob);
        System.out.println(((Wishes)day).getGreeting());

注意:此代码段可以进一步重构以满足您的要求

答案 3 :(得分:0)

Day课程中没有这样的方法“getWishes()。getGreeting”。你要做的是。

  1. 调用“Day.getWishes()并获取输出
  2. 在上面的输出对象之上调用getGreeting
  3. 在序列上你必须逐个执行。

    顺便说一句,我认为值得一看JXPath库作为替代方案。 你可以给一个复杂的对象并进行xpath搜索。

答案 4 :(得分:0)

反射调用没有堆叠 - 在课堂上没有名为“getWishes()。getGreeting()”的方法。

您需要先调用“Day.getWishes()”,然后在返回的对象上调用“getGreeting()”。