Java反射:访问内部类中的私有方法

Java反射:访问内部类中的私有方法,java,reflection,constructor,inner-classes,Java,Reflection,Constructor,Inner Classes,我在使用反射api的公共类中的私有类中使用私有方法时遇到问题。下面是一个简化的代码示例: public class Outer { private class Inner { private Integer value; private Inner() { this(0); } private Inner(Integer y) { value = y; }

我在使用反射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;
        }
    }
}
同样,我希望能够实例化一个
外部
类对象,然后从私有
内部
类调用
someMethod
。我一直试图通过反思来做到这一点,但我似乎无法通过1级考试。此外,内部类可能有也可能没有大多数代码似乎使用的构造函数。上面的代码只是一个框架

我当前的代码:

Outer outerObject = new Outer();
Constructor<?> constructor = innerNodeClass.getDeclaredConstructor(Outer.class);
constructor.setAccessible(true);
Object innerObject = constructor.newInstance(outerObject);
innerObject.someMethod(5)
outerOuterObject=newouter();
构造函数=innerNodeClass.getDeclaredConstructor(Outer.class);
constructor.setAccessible(true);
对象innerObject=constructor.newInstance(outerObject);
innerObject.someMethod(5)

我查找了各种获取内部类或私有方法的方法,但在不使用构造函数的情况下,找不到将外部对象获取到内部对象的方法。我只对在外部对象的元素上使用内部类中的私有方法感兴趣

一旦拥有内部对象的实例,就可以使用反射来调用方法本身:

Method someMethod = innerObject.getClass().getDeclaredMethod("someMethod", Integer.TYPE);
someMethod.setAccessible(true);
someMethod.invoke(innerObject, 5);

在调用方法时,您似乎停止了阅读文档和发明自己的东西。反射并没有在编译时提供做这些事情的能力。它仅在运行时使用,并且基于通过字符串的简单名称识别方法。非常混乱:“instanciate
Outer
并调用
somemethod
”,“获取内部类”,“获取外部对象而不使用构造函数”,“在外部元素上使用内部类的私有方法”。顺便说一句,“内部类可能没有构造函数”是错误的,每个对象都会有一个:声明的对象或默认对象在不使用构造函数的情况下无法找到将外部对象获取到内部对象的方法-因为
internal
是一个实例,因此,除了首先创建
outer
实例之外,无法获取
internal
的实例。因此,您必须创建两个实例(
outer
internal
)来调用
internal.someMethod()
,这意味着要使用
outer
internal
的构造函数。可能问题是如何为内部类获取
实例,如
Class innerNodeClass=Arrays.stream(Outer.class.getDeclaredClasses()).filter(c->c.getSimpleName().equals(“Inner”)).findFirst().get();
-如果可以更改外部类,可以选择:添加一个返回此类的静态方法(或类似方法-取决于项目/…)-LuCio的评论仍然适用!注意:该方法的参数应该是
Integer.class
而不是
Integer.TYPE
-它被声明为
Integer
(为什么会这样?)