Groovy如何能够访问Java类的私有方法?

时间:2016-12-02 09:54:35

标签: java groovy jvm bytecode access-modifiers

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

3 个答案:

答案 0 :(得分:2)

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

有关详细信息,请查看源代码中的java.lang.reflect,然后您将看到它如何使用场景后面的Reflection API。

答案 1 :(得分:1)

无论如何,您可以使用反射来执行此操作,例如,此方法将设置私有静态字段的值...

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?

答案 2 :(得分:0)

你可以使用java.lang.reflect

START             END               SHOP             ACTION   CHECK
2016-01-07        2016-01-10        ABC              B        1
2016-01-10        2016-02-07        ABC              B        0
2016-04-07        2016-05-07        ABC              B        0
2016-05-15        2016-05-18        ABC              S        0
2016-10-07        2016-10-07        ABC              B        0
2016-11-07        2016-11-07        ABC              B        0
2016-01-15        2016-01-22        DEF              S        0
2016-05-22        2016-11-07        DEF              S        1
2016-11-07        2016-12-07        DEF              S        0
2016-01-04        2016-02-04        XYZ              B        0
2016-09-07        2016-10-26        XYZ              T        0
2016-10-25        2016-10-30        XYZ              B        0