壊れたメガネ

ホッチキスの達人の意識の高いブログ。

Java で オブジェクトリテラル ってどう書くの?

/*
 * Java でオブジェクトリテラルってかけるのかな?と思いテスト。
 * 一応リテラルで書けるけど、これを以て extends は出来ない。
 * 下のリテラルでプロパティ(name, org)、メソッド(getName(), getOrg())は
 * いずれも public だけど、このオブジェクトの外からアクセス出来ない。
 * けど、リフレクションを使うとアクセスできた。
 * 
 * Java を書き続けてきた人からすると、
 * こういう書き方って反吐が出る思いなんだろうなぁ。
 * あ、あとダックタイピングとかも。。。
 * 
 * だれかおもしろい書き方あればおせーてください。
 */

package hm.moe.neetlife.oasynnoum;

import java.lang.reflect.Method;

public class ObjectLiteral {

    public static void main(String[] args) {
        Object o = new Object(){
            public String name = "oasynnoum";
            public String org = "neetlife.moe.hm";
        
            public String getName() {
                return this.name;
            }
            public String getOrg() {
                return this.org;
            }
            @Override
            public String toString() {
                return "name : " + this.getName() + ", " +
                        "org : " + this.getOrg();
            }
        };
        System.out.println(o); // name : oasynnoum, org : neetlife.moe.hm
        // System.out.println(o.name); // コンパイルエラー
        // System.out.println(o.getName()); // これもダメ

        Class c = o.getClass();
        try {
            Method mGetName = c.getMethod("getName", new Class[]{});
            System.out.println(mGetName.invoke(o, new Object[]{}));
            // oasynnoum と出力。一応よべる。
        } catch (Exception e) {
            System.err.println("invoking error");
            e.printStackTrace();
        }
    }
}