java.lang.Stringのメソッドをむりやり書き換える

このブログエントリーはご覧のスポンサーの提供でお送りします。


変態アドベントカレンダー in Summer



すみません。。自分の担当の日をすっかり忘れて放置してました。

というわけで、変態的なネタを考えてたらJava7から入ったinvoke dynamicを使ったmetaclass的実装を以前見た気がするのを思い出しました。

A cookbook for JSR 292


というわけで早速トライ!


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 って実行するとこんな感じになるよ!
f:id:tan_go238:20120722040303p:plain



なんか眠たくて変なテンションだ。。


追記。PDFの資料もあるよ。