【问题标题】:How is Groovy able to access private methods of a Java class?Groovy 如何访问 Java 类的私有方法?
【发布时间】:2016-12-02 09:54:35
【问题描述】:

Groovy 可以访问 Java 类的私有方法和变量。 Groovy 如何在幕后做到这一点?是因为使用了MethodHandle 类使用的invokedynamic 字节码指令吗?我认为 Java 使用 invokespecial 指令调用 private 方法和 invokevirtual 调用 public 对哪些尊重访问修饰符?

【问题讨论】:

  • 它使用反射。

标签: java groovy jvm bytecode access-modifiers


【解决方案1】:

Groovy 是用 Java 编写的,因此希望它不直接依赖字节码,它不使用 Reflection API

有关更多详细信息,请查看源代码中的java.lang.reflect,然后您将看到它如何在幕后使用反射 API。

【讨论】:

    【解决方案2】:

    你可以在Java中使用反射来做到这一点,例如,这个方法将设置一个私有静态字段的值......

    public static void setStaticField(Class<?> clazz, String fieldName, Object value) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(null, value);
        } catch (Exception ex) {
            throw new IllegalArgumentException("Could not set field '" + fieldName + "' of type '" + clazz.getName() + "' to: " + value, ex);
        }
    }
    

    通知field.setAccessible(true)

    可以通过设置适当的安全管理器策略来防止这种情况。见How to restrict developers to use reflection to access private methods and constructors in Java?

    【讨论】:

    • 是的,在 Java 中我可以使用反射,但是 groovy 是怎么做的呢? groovy 也使用反射吗?
    【解决方案3】:

    你可以使用 java.lang.reflect

    import java.lang.reflect.Method
    
    // ....
    
    Method method = a.getClass().getDeclaredMethod('initializeSeoCode')
    method.setAccessible(true)
    java.lang.Object r = method.invoke(a)
    

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 2013-08-03
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2017-07-15
      相关资源
      最近更新 更多