我正在尝试使用反射来调用其名称和参数在运行时已知的方法,但我失败了IllegalAccessException.
这是在一个对象上,该对象是一个实现公共接口的非公共类的实例,我有一个大脑痉挛试图记住调用这样一个方法的正确方法。
public interface Foo
{
public int getFooValue();
}
class FooImpl implements Foo
{
@Override public int getFooValue() { return 42; }
}
Object foo = new FooImpl();
Run Code Online (Sandbox Code Playgroud)
给定foo对象,我将如何反射性地调用 foo.getFooValue() ?
如果我查看 的结果foo.getClass().getMethods(),这应该可以工作,但我认为它会导致IllegalAccessException我必须打电话给这种情况getDeclaredMethods()吗?或者我是否必须遍历公共接口/超类并getDeclaredMethods在那里调用?
这有效:
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; }
}
Run Code Online (Sandbox Code Playgroud)