※ 引述《zanyking (最後的六年級生)》之銘言:
: 如標題,先寫一個java.lang.String,copy自原來的String但是把valueOf給換掉:
: public static String valueOf(char data[]) {
: if (data.length == 3) {
: boolean match = true;
: .....省略
: }
: return new String(data);
: }
: 接下來,把rt.jar拆包unzip到一個你喜歡的地方,把String生成的class換掉。
: 再來,準備一個資料夾,把JRE的東西都複製一包過去,但rt.jar用新的。
: 最後,請用HotSpot VM,用cmd啟動java時加入這個參數:
: java -Xbootclasspath:my_bootclasspath test.Output123
: 簡單的說,把String.valueOf的實做給換掉就好了,偵測到char[]{1,2,3}
: 就改吐"123"。
其實不用這麼麻煩,可以這樣
1.下載
http://search.maven.org/remotecontent?filepath=org/javassist/javassist/3.18.0-GA/javassist-3.18.0-GA.jar
然後加到class path
2.在Output123.java目錄下建立 Javassist123.java
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
public class Javassist123 {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("java.lang.String");
CtMethod[] ms = cc.getDeclaredMethods();
for (CtMethod m : ms) {
if ("valueOf".equals(m.getName()) &&
"([C)Ljava/lang/String;".equals(m.getSignature())) {
m.setBody("{return \"123\";}");
break;
}
}
cc.writeFile(".");
}
}
3.執行 javac Javassist123.java && java Javassist123
4.再執行 java -Xbootclasspath/p:. Output123
就會輸出123了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.140.144.134