2016-12-02 77 views
2

Groovy可以訪問Java類的私有方法和變量。 Groovy如何在現場做這件事?是否因爲使用invokedynamic字節碼指令而被MethodHandle類使用?我認爲Java使用invokespecial指令呼叫private方法和invokevirtualpublic權利,尊重訪問修飾符?Groovy如何訪問Java類的私有方法?

+1

它使用反射。 – Henry

回答

2

Groovy是用Java編寫的,因此它希望不直接依賴字節碼,它不使用Reflection API

有關詳細信息,請在源代碼中檢查java.lang.reflect,然後您將看到它在場景後面如何使用Reflection 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怎麼做? Groovy是否也使用反射? – boring