読者です 読者をやめる 読者になる 読者になる

Javaのリフレクション

まずは以下のコードを見てください。

public class Hoge {
    private String str;

    public Hoge(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "str = " + str;
    }

    public static void main(String[] args) {
        Hoge hoge = new Hoge("Hoge");
        System.out.println(hoge);
    }
}

上記のコードをコンパイルして実行すると以下のようになります。

$ javac Hoge.java
$ java Hoge
str = Hoge

上記のコードに以下のコード片を追記します。

Class<Hoge> clazz = Hoge.class;
try {
    Field field = clazz.getDeclaredField("str");
        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        field.set(hoge, "Fuga");
        System.out.println(hoge);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}  

再度コンパイルして実行してみます。

$ javac Hoge.java
$ java Hoge
str = Hoge
str = Fuga

私のようなJava初心者は、privateなフィールドは何人たりとも犯すことは出来ない聖域であると固く信じていた訳ですが、どうやらそうではないようです。