Groovy может получить доступ к приватным методам и переменным класса Java. Как Groovy делает это за сценой? Это из-за использования инструкции по использованию байт-кода invokedynamic
, которая используется классом MethodHandle
? Я думаю, что Java использует команду invokespecial
для вызова методов private
и invokevirtual
для public
право, которое уважает модификаторы доступа?Как Groovy может получить доступ к приватным методам Java-класса?
ответ
Groovy написан на Java, поэтому он надеется, что он не полагается на код байта напрямую, но не использует Reflection API.
Для получения более подробной информации проверьте на java.lang.reflect
в исходном коде, после чего вы увидите, как он использует API отражения за сценой.
Вы можете сделать это в 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 также отражением? – boring
Он использует отражение. – Henry