2016-12-02 6 views
2

Groovyは、Javaクラスのプライベート・メソッドおよび変数にアクセスできます。 Groovyはこれをシーンの背後でどのようにしていますか? MethodHandleクラスで使用されているinvokedynamicバイトコード命令の使用によるものですか?私はJavaがprivateメソッドを呼び出すためのinvokespecial命令を使用し、アクセス修飾子を尊重するpublicのためのinvokevirtualを使用すると思いますか?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)

これは、することによって防止することができます適切なSecurity Managerポリシーが設定されている必要があります。 How to restrict developers to use reflection to access private methods and constructors in Java?

+1

はい、Javaではリフレクションを使用できますが、groovyはどうしますか? groovyも反射を使用していますか? – boring

関連する問題