我遇到反射问题,只调用特定方法。 在我的情况下,我想调用方法getMyStuff(),它可能在多个Class中定义。
我的课程与此类似。 MainClass将始终是父级。 我有很多类,并不是所有的类都有getMyStuff()方法。我希望能够调用该方法并访问返回值。我尝试了许多代码来获取访问权限,但似乎没有任何工作。
任何想法, 感谢
class MainClass
{
public ClassA member1;
public String getMyStuff() {}
}
class ClassA
{
public ClassB member1;
public String getMyStuff() {}
}
class ClassB
{
public String getMyStuff() {}
}
答案 0 :(得分:1)
您可以使用这样的反射来调用方法:
public static String getMyStuff(Object o) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> cl = o.getClass();
Method m = cl.getMethod("getMyStuff");
return (String) m.invoke(o);
}
然而,将该方法添加到接口并使用类
实现此接口会容易得多public interface MyStuffContainer {
public String getMyStuff();
}
class ClassA implements MyStuffContainer
{
public ClassB member1;
public String getMyStuff() {}
}
public static String getMyStuff(Object o) {
if (!(o instanceof MyStuffContainer))
throw new IllegalArgumentException();
return ((MyStuffContainer)o).getMyStuff();
}
在这两种情况下都会像这样调用静态getMyStuff
方法:
getMyStuff(new MainClass());
getMyStuff(new ClassA());
getMyStuff(new ClassB());
答案 1 :(得分:0)
为什么不从MainClass 扩展并在需要时覆盖getMyStuff()?
答案 2 :(得分:0)
首先查看您的课程并检查课程是否具有您想要的方法:
Class c = ob.getClass();
for (Method method : c.getDeclaredMethods()) {
System.out.println(method.getName());
// check for the getMyStuff() method
}
如果方法存在,则创建该类的实例并调用方法:
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });
答案 3 :(得分:0)
我知道这不是那么好的解释但基本上我不明白你必须首先访问该字段,传入该字段所在的对象,然后“field.get(objectValue)”查看该objectValue和返回具有该字段名称的对象。有点反思我的想法。
感谢您的帮助。