我在使用反射API时,遇到了在一个公共类中调用私有类中的私有方法的问题。以下是一个简化的代码示例:
public class Outer {
private class Inner {
private Integer value;
private Inner() {
this(0);
}
private Inner(Integer y) {
value = y;
}
private Integer someMethod(Integer x) {
return x * x;
}
}
}
我想实例化一个Outer
类对象,然后从私有Inner
类调用someMethod
。我一直试图使用反射来实现这一点,但似乎只能深入1级。此外,内部类可能具有或不具有大多数代码似乎使用的构造函数。上面的代码只是框架。
我的当前代码:
Outer outerObject = new Outer();
Constructor<?> constructor = innerNodeClass.getDeclaredConstructor(Outer.class);
constructor.setAccessible(true);
Object innerObject = constructor.newInstance(outerObject);
innerObject.someMethod(5)
我查找了多种方法来访问内部类或私有方法,但是没有找到一种不使用构造函数就能将外部对象传递给内部对象的方法。我只想在外部对象的元素上使用内部类中的私有方法。
Outer
并调用someMethod
”、“访问内部类”、“在不使用构造函数的情况下将外部对象传递给内部对象”、“在外部元素上使用内部类的私有方法”。顺便说一句,“内部类可能没有构造函数”是错误的,每个对象始终会有一个构造函数:声明的构造函数或默认构造函数。 - user85421Inner
是一个内部类,因此不是静态嵌套类,所以没有办法在不使用构造函数的情况下获取Outer
对象的实例。因此,您必须创建两个实例(outer
,inner
)才能调用inner.someMethod()
,这意味着要使用Outer
和Inner
的构造函数。 - LuCioClass
实例,例如Class<?> innerNodeClass = Arrays.stream( Outer.class.getDeclaredClasses() ).filter( c -> c.getSimpleName().equals("Inner") ).findFirst().get();
。另一种选择是,如果您可以更改Outer类:添加一个返回该类的静态方法(或类似的东西-取决于项目/...)- LuCio的评论仍然适用! - user85421