続・DuckTyping

で、Reflectionを使ったJavaでのDuckTyping。

package sample.ducktype;

import java.util.ArrayList;

public class DuckTypeByReflection {
    public static void main(String[] args) throws Exception {
        ArrayList<Object> al = new ArrayList<Object>();

        Object selfishDuck = new Object() {
            public Object quackSelfish(Object obj) {
                return "I am selfish Duck";
            };
        };
        al.add(selfishDuck);

        Object selfishSwan = new Object() {
            public Object quackSelfish(Object obj) {
                return "I am selfish Swan";
            };
        };
        al.add(selfishSwan);

        for (Object selfish : al) {
            System.out.println(selfish.getClass().getDeclaredMethod(
                    "quackSelfish", new Class[] { Object.class }).invoke(
                    selfish, new Object[] { new Object() }));
        }
    }
}

I am selfish Duck
I am selfish Swan

別に面白くもないし、激しく遅いな。

あとはJavassistでゴニョゴニョしてDuckTypingとか、AOPを使ったDuckTypingかー。
こういうネタって使い古されてるんだろうなあ。自分の備忘録のために書いてるから別にいいんだけど。

あと、Javaのコードが書けなくてビビッた。Eclipse先生がいろいろ教えてくれるけど、Reflectionの書き方もきれーに忘れてるし、Tigerの文法もきっちり理解してないから、ホバーの意味もいまいち理解できなかったし。