2008/11/06

ほんとだ、groovyでprivateフィールドにアクセスできる

クラスのprivateフィールドにアクセスできてしまうよ。という記事があったので、「そんなことはないだろー」と思って試してみると、ほんとだ、書き込めちゃった。

意外と単純なところに落とし穴があったんですね。

どうやら、finalキーワードをつけたフィールドにアクセスした場合には、以下の例外が発生する用にはなっているようです。

groovy.lang.ReadOnlyPropertyException

ちなみに試したgroovyのバージョンは1.5.7です。

2 件のコメント:

  1. これは私の考えではバグというより仕様で、Groovyの根幹的な動作原理として、invokeMethodとかgetPropertyとかのメソッドを経由して動的にフィールドやメソッドにアクセスしていることに起因しています。

    たとえば、アクセス制御を動的に行なうには、呼ばれたメソッドがどのクラス・パッケージに所属しているのかを動的にチェックする必要があり、スタックとレース情報を取得すれば可能になる可能性がありますが、実行性能に相当大きなオーバーヘッドを及ぼすものと思います。
    従って、そう簡単に直ったりする種類のものではないと思います。

    返信削除
  2. いつもコメントありがとうございます。

    フィールドが勝手に書き換えられてしまうのはまずいですが、それはfinalで抑制できそうですし、
    参照できるのはさほど問題ではないかな、と思っています。

    groovyの便利さ、快適さを否定する要因にはぜんぜんなりませんね。

    返信削除