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