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

5

我正在尝试使用反射机制调用一个在运行时已知名称和参数的方法,但是遇到了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

2个回答

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; }
}

呃,我得走遍接口和子类才能找到一个可行的方法。 - Jason S
嗯,看来我没有表述清楚问题。我会接受并再试一次。 - Jason S

0

我认为你应该调用getDeclaredMethods()方法。

这里有一个例子:

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");
}

顺便提一下,关于“私有类反射”的帖子:

当涉及到字节码(即运行时),不存在私有类这样的东西。这是编译器维护的虚构。对于反射API来说,存在一个包访问类型和一个公共成员方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接