当前位置: 首页 > 面试题库 >

使用java.lang.invoke.MethodHandle调用私有方法

虞裕
2023-03-14
问题内容

如何使用方法句柄调用私有方法?

据我所知,只有两种可公开访问的Lookup实例:

  • MethodHandles.lookup()
  • MethodHandles.publicLookup()

也不允许无限制的私人访问。

有非公开组织Lookup.IMPL_LOOKUP可以满足我的需求。是否有一些公开的方式来获取它(假设SecurityManager允许它)?


问题答案:

事实证明,可以使用Lookup#unreflect(Method)并暂时使方法可访问(除非在程序初始化期间完成,否则可能会引入小的安全性问题)。

这是Thorben的答案的主要修改方法:

public static void main(String[] args) {

    Lookup lookup = MethodHandles.lookup();
    NestedTestClass ntc = new Program().new NestedTestClass();

    try {
        // Grab method using normal reflection and make it accessible
        Method pm = NestedTestClass.class.getDeclaredMethod("gimmeTheAnswer");
        pm.setAccessible(true);

        // Now convert reflected method into method handle
        MethodHandle pmh = lookup.unreflect(pm);
        System.out.println("reflection:" + pm.invoke(ntc));

        // We can now revoke access to original method
        pm.setAccessible(false);

        // And yet the method handle still works!
        System.out.println("handle:" + pmh.invoke(ntc));

        // While reflection is now denied again (throws exception)
        System.out.println("reflection:" + pm.invoke(ntc));

    } catch (Throwable e) {
        e.printStackTrace();
    }

}


 类似资料:
  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 我试图模仿一个私有方法,如下所示。但是,在第4行,JUnit正在调用相关的validateLanguage方法,并且由于私有方法validateLanguage在调用其他方法时引发了异常,因此没有返回模拟值。我的理解是,使用PowerMock的JUnit应该跳过validateLanguage实际实现的调用。有人能澄清一下吗?

  • 如何使用方法句柄调用私有方法? 据我所知,只有两种可公开访问的实例: 方法andles.lookup 两者都不允许不受限制的私人访问。 还有非公开的这就是我想要的。是否有某种公开的方式获得它(假设SecurityManager允许)?

  • 我有一节课是这样的 在我使用matutor方法时,php在调用函数abc()时发现了一个致命错误。它说从上下文调用私有方法xxx。 我所知道的oop是非常新的,私有方法/属性只能在同一个类中使用。然而,我不能调用abc(),即使它在同一个类中。 怎么会?

  • 问题内容: 我想调用一个私有静态方法。我有名字 我听说可以使用Java反射机制来完成。我该怎么做? 编辑: 我在尝试调用该方法时遇到的一个问题是如何指定其参数的类型。我的方法收到一个参数,其类型为Map。因此,我不能这样做(在运行时,由于Java Type擦除,没有Map这样的东西)。是否有另一种方法来获得该方法? 问题答案: 假设您要调用MyClass.myMethod(int x);

  • 问题内容: 您如何看待使用 私有静态方法 ? 就个人而言,我更喜欢使用 静态 私有方法而不 是非 静态 方法,只要它不需要访问任何实例字段即可。 但是我听说这种做法违反了OOP原则。 编辑:我想从样式的角度来看,而不是性能。 问题答案: 一个方法本身本身并没有违反OOP,但是当类上有很多不需要(也不能*)访问实例字段的方法时,您就不会以OO方式进行编程,因为“对象”表示状态+一起定义的状态操作。如