Java:反射调用实现公共接口的非公共类中的方法

Jas*_*n S 5 java reflection

我正在尝试使用反射来调用其名称和参数在运行时已知的方法,但我失败了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在那里调用?

bla*_*mpe 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; }
}
Run Code Online (Sandbox Code Playgroud)