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

Java:在实现公共接口的非公共类中调用方法的反射,java,reflection,Java,Reflection,我试图使用反射来调用一个方法,该方法的名称和参数在运行时是已知的,但由于出现IllegalAccessException而失败 这是在一个对象上的,它是一个非公共类的实例,实现了一个公共接口,我大脑痉挛,试图记住调用这种方法的正确方法 public interface Foo { public int getFooValue(); } class FooImpl implements Foo { @Override public int getFooValue() { retu

我试图使用反射来调用一个方法,该方法的名称和参数在运行时是已知的,但由于出现
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

我认为您应该调用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");
}
methodmethods[]=secretClass.getDeclaredMethods();
System.out.println(“访问所有方法”);
对于(inti=0;i
顺便说一下,引用“”的帖子:

当涉及字节码(即运行时)时,没有私有类。这是由编译器维护的虚构。对于反射API,有一个带有公共成员方法的包可访问类型

这项工作:

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; }
}
import java.lang.reflect.InvocationTargetException;
导入java.lang.reflect.Method;
公共类
{
公共静态void main(字符串[]args)引发异常
{
最终字符串methodName=“getFooValue”;
Object foo=new FooImpl();
类c=foo.getClass();
方法m=c.getDeclaredMethod(methodName,null);
System.out.println(m.invoke(foo));
}
}
接口Foo
{
public int getFooValue();
}
类FooImpl实现Foo
{
@重写公共int getFooValue(){return 49;}
}

blech,我必须遍历接口+子类,然后才能找到一个有效的方法。我似乎没有把这个问题说清楚。我会接受并再试一次。