java.lang.Stringのメソッドをむりやり書き換える
このブログエントリーはご覧のスポンサーの提供でお送りします。
すみません。。自分の担当の日をすっかり忘れて放置してました。
というわけで、変態的なネタを考えてたらJava7から入ったinvoke dynamicを使ったmetaclass的実装を以前見た気がするのを思い出しました。
というわけで早速トライ!
Mainクラスは以下のようにして、toUpperCaseを途中からtoLowerCaseにしてみたよ!
これでばっちり色んな変態ないたずらができるね!
package metaclass; import java.lang.invoke.MethodHandles; import metaclass.MetaClass; import static java.lang.invoke.MethodType.*; /** * このプログラムは以下のURLにあるソースコードをほぼそのまままるっと参考にしています。 * http://code.google.com/p/jsr292-cookbook/ */ public class Main { public static String toLowerCase(String s) { return s.toLowerCase(); } public static void main(String[] args) throws ReflectiveOperationException { for (int i = 0; i < 10; i++) { System.out.println("Hello".toUpperCase()); if (i == 5) { MetaClass.getMetaClass(String.class).redirect( "toUpperCase", methodType(String.class), MethodHandles.lookup().findStatic(Main.class, "toLowerCase", methodType(String.class, String.class))); } } } }
全ソースはGitHubにあげたよ!
https://github.com/tango238/hentaiMetaClass
コンソールから ant run って実行するとこんな感じになるよ!
なんか眠たくて変なテンションだ。。
追記。PDFの資料もあるよ。