2016-12-02 7 views
2

Groovy может получить доступ к приватным методам и переменным класса Java. Как Groovy делает это за сценой? Это из-за использования инструкции по использованию байт-кода invokedynamic, которая используется классом MethodHandle? Я думаю, что Java использует команду invokespecial для вызова методов private и invokevirtual для public право, которое уважает модификаторы доступа?Как Groovy может получить доступ к приватным методам Java-класса?

+1

Он использует отражение. – Henry

ответ

2

Groovy написан на Java, поэтому он надеется, что он не полагается на код байта напрямую, но не использует Reflection API.

Для получения более подробной информации проверьте на java.lang.reflect в исходном коде, после чего вы увидите, как он использует API отражения за сценой.

1

Вы можете сделать это в 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?

+1

Да, на Java я могу использовать отражение, но как это сделать? Является ли groovy также отражением? – boring

 Смежные вопросы

  • Нет связанных вопросов^_^