说,有一个类( A )有一个字段( myField )。字段 myField 的类型是一个界面(我)。一切都是公开的。
我需要调用类的方法,该方法是* 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
答案 0 :(得分:7)
invoke
方法的第一个参数只是调用该方法的对象。所以假设你有一个与I.m(String)
对应的非静态方法。您需要一个I
实例来调用它(因为这是一个非静态方法)。
据推测,你想通过反射调用等效的myField.m(input)
,因此你只需传入myField
作为第一个参数:
boolean result = (Boolean) method.invoke(myField, paramsObj);
答案 1 :(得分:0)
解决方案是:
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 ...