2016-12-02 10 views
2

Groovy kann auf private Methoden und Variablen einer Java-Klasse zugreifen. Wie macht Groovy das hinter der Bühne? Ist es wegen der Verwendung von invokedynamic Bytecode-Anweisung, die von MethodHandle Klasse verwendet wird? Ich denke, Java verwendet invokespecial Anweisung zum Aufruf private Methoden und invokevirtual für public Recht, die Zugriffsmodifizierer respektiert?Wie kann Groovy auf private Methoden einer Java-Klasse zugreifen?

+1

Es verwendet Reflexion. – Henry

Antwort

2

Groovy ist in Java geschrieben, so hofft es hoffentlich nicht direkt auf den Byte-Code, es verwendet es nicht Reflection API.

Weitere Details überprüfen Sie für java.lang.reflect im Quellcode, Sie werden dann sehen, wie es die Reflection API hinter der Szene verwendet.

1

Sie können dies ohnehin in Java tun, indem sie mithilfe von Reflektion zum Beispiel diese Methode den Wert eines privaten statischen Feldes gesetzt ...

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); 
    } 
} 

Hinweis field.setAccessible(true)

Dies kann verhindert werden durch eine geeignete Security Manager Policy eingerichtet haben. Siehe How to restrict developers to use reflection to access private methods and constructors in Java?

+1

Ja, in Java kann ich Reflektion verwenden, aber wie funktioniert Groovy? Ist groovy auch Reflexion? – boring

Verwandte Themen