やる夫がAOPを始めるそうです。
guiceでやってみました。
import java.util.Date; import java.util.logging.*; import org.aopalliance.intercept.*; import com.google.inject.*; import static com.google.inject.matcher.Matchers.*; public class やる夫が { static final Logger logger = Logger.getLogger("yaruo"); static final Foo AOPを始めるそうです = Guice.createInjector(new AbstractModule() { protected void configure() { bindInterceptor(any(), any(), new MethodInterceptor() { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { logger.info(methodInvocation.getMethod().getName()); try { return methodInvocation.proceed(); } catch (Exception e) { logger.severe(e.getClass().getSimpleName()); throw e; } } }); } }).getInstance(Foo.class); public static void main(String[] args) throws Exception { FileHandler handler = null; try { handler = new FileHandler("やる夫がAOPを始めるそうです.log"); handler.setFormatter(new やる夫Formatter()); logger.addHandler(handler); やる夫が.AOPを始めるそうです.ほげほげ(); } finally { if (handler != null) handler.close(); } } } @ImplementedBy(FooImple.class) interface Foo { public void ほげほげ(); } class FooImple implements Foo { public void ほげほげ() { throw new RuntimeException(); } } class やる夫Formatter extends Formatter { private int i = 0; @Override public String format(LogRecord record) { StringBuilder s = new StringBuilder(); s.append(++i); s.append(" 名前:以下、名無しにかわりましてVIPがお送りします。 "); s.append(new Date(record.getMillis())); s.append("\n"); if (record.getLevel().equals(Level.INFO)) { s.append(info(record)); } else if (record.getLevel().equals(Level.SEVERE)) { s.append(severe(record)); } s.append("\n"); return s.toString(); } public String info(LogRecord record) { StringBuilder s = new StringBuilder(); s.append(" ____\n"); s.append(" / \ \n"); s.append(" / ─ ─\ \n"); s.append("/ (●) (●) \ \n"); s.append("| (__人__) | "+record.getMessage()+"・・・\n"); s.append("/ ∩ノ ⊃ / \n"); s.append("( \ / _ノ | | \n"); s.append(".\ /“ /__| |\n"); s.append(" \ /___ /\n"); return s.toString(); } public String severe(LogRecord record) { StringBuilder s = new StringBuilder(); s.append(" ______. ━┓\n"); s.append(" / ― \ ┏┛\n"); s.append(" /ノ (●) │ ・\n"); s.append(". | (●) ⌒) / "+record.getMessage()+"\n"); s.append(". | (__ノ ̄ /\n"); s.append(" \_ <´\n"); s.append(" /´ `\\n"); s.append(" | |\n"); s.append(" | |\n"); s.append("\n"); s.append(" /)\n"); s.append(" ///)\n"); s.append(" /,.=゙''\"/\n"); s.append(" / i f ,.r='\"-‐'つ____ 細けぇ事はいいんだよ!!\n"); s.append(" / / _,.-‐'~/⌒ ⌒\\n"); s.append(" / ,i ,二ニ⊃( ●). (●)\\n"); s.append(" / ノ il゙フ::::::⌒(__人__)⌒::::: \\n"); s.append(" ,イ「ト、 ,!,!| |r┬-| |\n"); s.append(" / iトヾヽ_/ィ\"\ `ー'´ /\n"); return s.toString(); } }
むしろloggingの方に手間掛けてるしw
出力
1 名前:以下、名無しにかわりましてVIPがお送りします。 Mon Apr 13 17:43:34 JST 2009 ____ / \ / ─ ─\ / (●) (●) \ | (__人__) | ほげほげ・・・ / ∩ノ ⊃ / ( \ / _ノ | | .\ /“ /__| | \ /___ / 2 名前:以下、名無しにかわりましてVIPがお送りします。 Mon Apr 13 17:43:34 JST 2009 ______. ━┓ / ― \ ┏┛ /ノ (●) │ ・ . | (●) ⌒) / RuntimeException . | (__ノ ̄ / \_ <´ /´ `\ | | | | /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ 細けぇ事はいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /