私はそれが悪いコード設計である知っているがネストされている値にアクセスするには、しかし、一時的なハックとして...リフレクションは、クラス
私は値が静的な入れ子になったクラスの初期化されている民間のマップにアクセスする必要があります。次の例では、別のパッケージからmyMapの各値にアクセスしたいとします。
package belongs.to.someone.else
public class SOExample {
private Map<String, NestedClass> myMap;
static class NestedClass {
final int data;
NestedClass(final int data) {
this.data = data;
}
}
public void populateMyMap(){
for(int i=0; i<100; i++){
this.myMap.put(Integer.toString(i), new NestedClass(i));
}
}
}
しかし、私はアクセス可能にSOExample.myMapフィールドを設定しようとしたとき鶏と卵の問題に遭遇しているようです。最後のステートメントのSOExample.NestedClass
値の "パッケージの外部からアクセスできません"というエラーが表示されます。
package belongs.to.me
public class SOExampleMyPackage {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
SOExample example = new SOExample();
example.populateMyMap();
// Make the example.myMap field accessible
Field f = example.getClass().getDeclaredField("myMap");
f.setAccessible(true);
// Next line throws error
Map<String, SOExample.NestedClass> myMapHere = (Map<String, SOExample.NestedClass>) f.get(example);
}
}
この問題の解決方法に関するご意見をお待ちしております。
「myMapHere」はどのように使用しますか? 'NestedClass'はパッケージプライベートなので、' SOExample.NestedClass'を介して 'NestedClass'にアクセスすることはできません。 – Pshemo
'NestedClass'は実際に興味のあるメソッドを含むいくつかのパブリックインターフェイスを実際に実装することは可能でしょうか?その場合、 'Map'または 'Map 'を継承します。 –
Pshemo
@Pshemo myMapには、収束までに1日かかる非常に遅い離散イベントシミュレーションによって作成される約500kの値があります。 myMapをシリアライズし、すぐにデシリアライズできるようにそのデータを手元に置いておきたいと思います。 – andrew