で、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の文法もきっちり理解してないから、ホバーの意味もいまいち理解できなかったし。