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