繁体   English   中英

Java反射:获取Field为接口类型的字段值

[英]Java Reflection: Get a Field's Value where the Field is of an Interface Type

比如,有一个类( 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

有人能帮助我吗?

编辑 :我试过用

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

但是发现了IllegalArgumentException

invoke方法的第一个参数就是invoke方法的对象。 所以假设你有一个与Im(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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM