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

时间:2011-05-12 21:37:19

标签: java reflection

我正在尝试使用反射来调用一个方法,该方法的名称和参数在运行时已知,并且我使用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 个答案:

答案 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,有一个包可访问类型,带有公共成员方法。