java - 使用 java.lang.invoke.MethodHandle 调用私有(private)方法

标签 java reflection java-7 invokedynamic methodhandle

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

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

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

并且都不允许不受限制的私有(private)访问。

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

最佳答案

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

这里修改了 Thorben 的回答中的 main 方法:

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();
    }

}

关于java - 使用 java.lang.invoke.MethodHandle 调用私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135218/

相关文章:

java - 如何在 Spring Boot 应用程序中手动注册非标准化 SQL 函数?

java - java中的ip地址

C# 如何在其类型为 List<T> 且我有一个 List<object> 时设置 PropertyInfo 值

html - 如何使用 Angular 7 调用与 html 中的字符串 "component name"相同的组件

java - 为什么 Collections.sort(List) 在 Java 8 中使用 CopyOnWriteArrayList 而在 Java 7 中不起作用?

java - 将隐藏在字符串中的随机变化的数字设置为整数

java - 制作一个基本算法——更有趣的版本

java - 我可以使用字符串变量作为数据类型在 Java 中创建其他变量吗

java - System.lineSeparator() 在 Windows 上未按预期工作

java - 如何在 Maven 中使用给定的 JDK 强制编译