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

4

我在使用反射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)

我查找了多种方法来访问内部类或私有方法,但是没有找到一种不使用构造函数就能将外部对象传递给内部对象的方法。我只想在外部对象的元素上使用内部类中的私有方法。


当涉及调用方法时,似乎您停止阅读文档并发明自己的东西了。反射在编译时无法做到这一点,它仅限于运行时,并基于通过其纯名称作为字符串来识别方法的能力。 - GhostCat
非常困惑:“实例化Outer并调用someMethod”、“访问内部类”、“在不使用构造函数的情况下将外部对象传递给内部对象”、“在外部元素上使用内部类的私有方法”。顺便说一句,“内部类可能没有构造函数”是错误的,每个对象始终会有一个构造函数:声明的构造函数或默认构造函数。 - user85421
1
由于Inner是一个内部类,因此不是静态嵌套类,所以没有办法在不使用构造函数的情况下获取Outer对象的实例。因此,您必须创建两个实例(outerinner)才能调用inner.someMethod(),这意味着要使用OuterInner的构造函数。 - LuCio
也许问题在于如何获取内部类的Class实例,例如Class<?> innerNodeClass = Arrays.stream( Outer.class.getDeclaredClasses() ).filter( c -> c.getSimpleName().equals("Inner") ).findFirst().get();另一种选择是,如果您可以更改Outer类:添加一个返回该类的静态方法(或类似的东西-取决于项目/...)- LuCio的评论仍然适用! - user85421
1个回答

3
一旦您拥有内部对象的实例,您可以使用反射调用方法本身:
Method someMethod = innerObject.getClass().getDeclaredMethod("someMethod", Integer.TYPE);
someMethod.setAccessible(true);
someMethod.invoke(innerObject, 5);

1
请注意:该方法的参数应为 Integer.class 而不是 Integer.TYPE - 它被声明为 Integer(为什么呢?) - user85421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接