kagamihogeの日記

kagamihogeの日記です。

IllegalAccessException

よく見かけるようで見かけない例外が発生する、というバグレポートが上がってきた。こいつが出る原因は javadoc 見ればある程度は想像が付くし、JavaHouse ML にまとめられていて、

一番ありがちなのはSampleClassがpublicでないか自前のコンストラクタを定義してそれがpublicでない(コンストラクタを一つも定義してなければ大丈夫)かのどちらかでしょう。まずはこの2点を確認してみて下さい。

というわけなのでコードをチェックしてみると


public class Hoge {
private Hoge() {...}
}

...

Object obj = Hoge.class.newInstances();

とか。そりゃまぁ実行時例外も出るわな、といった感じのコード。

しかし、不思議なのはこのコード自体はもう 2 年は前に書かれたコードだということ。しょっちゅう呼ばれる個所のコードだし、IllegalAccessException が確実に出るはずのコードなのにここ 2 年は何の問題もなく動いていたし・・・謎すぎる。

どうやら、この private な引数無しコンストラクタをリフレクションで呼ぶコードの存在するモジュールをある順序で使うと IllegalAccessException が出る、らしい。しかも必ずではなく、出たり出なかったりする。ある順序についてはプロジェクト固有の事情が絡むのでちょっと書けない。

Sun の JDK 上だと 100% IllegalAccessException で落ちるから WAS 固有の挙動っぽい。

WAS のバグ?なのかなぁ?にしても、理論上は絶対に落ちるコードなのに、やり様によってはマッタク例外出なかったり、時々例外出るようになったりするのは一体何なんだろうなぁ。