我正在尝试学习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文件。因此它可能包含单个方法或方法调用序列,如上所述。
答案 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”。你要做的是。
在序列上你必须逐个执行。
顺便说一句,我认为值得一看JXPath库作为替代方案。 你可以给一个复杂的对象并进行xpath搜索。
答案 4 :(得分:0)
反射调用没有堆叠 - 在课堂上没有名为“getWishes()。getGreeting()”的方法。
您需要先调用“Day.getWishes()”,然后在返回的对象上调用“getGreeting()”。