Java,Reflection和方法调用

时间:2016-12-14 14:21:12

标签: java reflection

我遇到反射问题,只调用特定方法。 在我的情况下,我想调用方法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() {}
}

4 个答案:

答案 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)

我今天解决了。我遇到的主要问题是如何获取/访问ClassA和ClassB中的对象。我以为你需要以某种方式迭代对象并依次访问每个对象。然而,反思有一个不同的范例。您可以通过getDeclaredFields()遍历所有字段。为字段“Field field = aClass.getField(”someField“)获取Field对象后;”然后,您需要使用Field对象来访问该字段的基础对象“Object value = field.get(objectValue);”

我知道这不是那么好的解释但基本上我不明白你必须首先访问该字段,传入该字段所在的对象,然后“field.get(objectValue)”查看该objectValue和返回具有该字段名称的对象。有点反思我的想法。

感谢您的帮助。