Java 反射:获取字段的值,其中字段属于接口类型



假设有一个类( a ),它有一个字段(myField)。字段myField的类型是接口(I)。一切都是公开的。

我需要调用类的一个方法,该方法是*myField *的类型。我的代码如下:

 Field myField = getField(myClass, "fieldName");
 Class fieldClass = myField.getType(); // returns I
 try {
        Class[] params = {String.class};
        Method method = fieldClass.getMethod("methodName", params);
        Object[] paramsObj = {new String("input")};
        boolean result = (Boolean) method.invoke(WHAT_MUST_I_PUT_HERE, paramsObj);
} catch...

正如你所看到的,问题是我不能做这样的事情:

WHAT_MUST_I_PUT_HERE = myField.getClass() // returns Field

有人能帮我吗?

EDIT:我已经尝试使用

TargetClass o = (TargetClass) myField.get(myClass)

但是捕获了IllegalArgumentException

invoke方法的第一个参数就是要调用该方法的对象。假设你有一个对应于I.m(String)的非静态方法。你需要一个I的实例来调用它(因为这是一个非静态方法)。

假设您想通过反射调用myField.m(input)的等价物,因此您只需将myField作为第一个参数传递:

boolean result = (Boolean) method.invoke(myField, paramsObj);

解决方案是:

    Class myClass = service.getClass();
    Field myField = getField(myClass, "fieldName");
    TargetClass target = null;
    try {
        target = (TargetClass) myField.get(service);
    } catch (IllegalAccessException e) {
        e.printStatckTrace();
    }
    Class fieldClass = myField.getType();
    try {
        Class[] params = {String.class};
        Method myMethod = fieldClass.getMethod("methodName", params);
        String paramItem = new String("value");
        Object[] paramsObj = {paramItem};
        boolean result = (Boolean) myMethod.invoke(target, paramsObj);         
    } catch ...

相关内容

  • 没有找到相关文章

最新更新