ほんとだ、Groovyでprivateフィールドにアクセスできる
クラスのprivateフィールドにアクセスできてしまうよ。 という記事があったので、 「そんなことはないだろー」 と思って試してみると、ほんとだ、書き込めちゃった。
意外と単純なところに落とし穴があったんですね。
どうやら、finalキーワードをつけたフィールドにアクセスした場合には、 groovy.lang.ReadOnlyPropertyException
例外が発生するにはなっているようです。
ちなみに試したGroovyのバージョンは 1.5.7 です。
ディスカッション
コメント一覧
これは私の考えではバグというより仕様で、Groovyの根幹的な動作原理として、invokeMethodとかgetPropertyとかのメソッドを経由して動的にフィールドやメソッドにアクセスしていることに起因しています。
たとえば、アクセス制御を動的に行なうには、呼ばれたメソッドがどのクラス・パッケージに所属しているのかを動的にチェックする必要があり、スタックとレース情報を取得すれば可能になる可能性がありますが、実行性能に相当大きなオーバーヘッドを及ぼすものと思います。
従って、そう簡単に直ったりする種類のものではないと思います。
いつもコメントありがとうございます。
フィールドが勝手に書き換えられてしまうのはまずいですが、それはfinalで抑制できそうですし、
参照できるのはさほど問題ではないかな、と思っています。
groovyの便利さ、快適さを否定する要因にはぜんぜんなりませんね。