我正在尝试使用反射来调用一个方法,该方法的名称和参数在运行时已知,并且我使用IllegalAccessException
失败了。
这是一个对象,它是一个非公共类的实例,它实现了一个公共接口,并且我有一个大脑抽筋试图记住调用这种方法的正确方法。
public interface Foo
{
public int getFooValue();
}
class FooImpl implements Foo
{
@Override public int getFooValue() { return 42; }
}
Object foo = new FooImpl();
给定foo
对象,我如何反思地调用foo.getFooValue()?
如果我查看foo.getClass().getMethods()
的结果,这应该有用,但我认为这会导致IllegalAccessException
这是我需要调用getDeclaredMethods()
的情况吗?或者我是否必须浏览公共接口/超类并在那里调用getDeclaredMethods
?
答案 0 :(得分:3)
这有效:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Ex
{
public static void main(String[] args) throws Exception
{
final String methodName = "getFooValue";
Object foo = new FooImpl();
Class<?> c = foo.getClass();
Method m = c.getDeclaredMethod(methodName, null);
System.out.println(m.invoke(foo));
}
}
interface Foo
{
public int getFooValue();
}
class FooImpl implements Foo
{
@Override public int getFooValue() { return 49; }
}
答案 1 :(得分:0)
我认为你应该调用getDeclaredMethods()。
Here就是一个例子:
Method methods[] = secretClass.getDeclaredMethods();
System.out.println("Access all the methods");
for (int i = 0; i < methods.length; i++) {
System.out.println("Method Name: " + methods[i].getName());
System.out.println("Return type: " + methods[i].getReturnType());
methods[i].setAccessible(true);
System.out.println(methods[i].invoke(instance, EMPTY) + "\n");
}
顺便说一下,帖子引用了'private classes reflection':
当谈到字节码(即运行时)时,就没有私有类这样的东西。这是编译器维护的虚构。对于反射API,有一个包可访问类型,带有公共成员方法。