前書き
Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい の黒魔術編です。
動作環境
- Java8
- javassist 3.22.0-GA
ロジック等
Javaなので(?)、if判定部分は別のクラスに抜き出します。
引数の値を書き換える訳ではないので、staticなメソッドにします。
package study.javassist;
public class Judge {
public static boolean judge(int a) {
if (a == 1 && a == 2 && a == 3) {
return true;
} else {
return false;
}
}
}
上記クラスを呼び出す、メインクラスは以下です。
package study.javassist;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class JudgeCall {
public static void main(String[] args) {
try {
new JudgeCall().execute();
} catch (NotFoundException | CannotCompileException e) {
e.printStackTrace();
}
}
private void execute() throws NotFoundException, CannotCompileException {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("study.javassist.Judge");
CtMethod method = cc.getDeclaredMethod("judge");
String newJudgeMethod = "{return true;}";
method.setBody(newJudgeMethod);
cc.toClass();
System.out.println(Judge.judge(1));
System.out.println(Judge.judge(2));
System.out.println(Judge.judge(3));
System.out.println(Judge.judge(4));
}
}
結果
true
true
true
true
解説
execute()メソッドの中で、study.javassist.Judgeクラスのjudgeメソッドの処理内容を書き換えて、常にtrueになるようにしています。
やってみた感想
javassist、なんとなく避けてたけどシステムの基盤部分を扱う際に使えるのでは?
次に機会があったら検討してみる。