摘要:
env:
os:ubuntu 16.04 x64
openjdk8u
//java.lang.String package java.lang; import java.lang.StringDebugHelper; //... public final class String{ final char value[];//remove private public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { // {replace begin String anotherString = (String)anObject; if(StringDebugHelper.Equals.isInAttention(this) || StringDebugHelper.Equals.isInAttention(anotherString)){ //new Throwable().getStackTrace();//not crash //System.out.println("xxxxx");//not crash new Throwable("attention:"+this).printStackTrace(); } //Thread.currentThread().getStackTrace();//crash //new Throwable().getStackTrace();//crash //new Exception("uuuuuuuuuu");//crash //new String("ffffdxx");//not crash //System.out.println("xxxxx");//crash int n = value.length; return StringDebugHelper.Equals.equals(this.value, anotherString.value); //replace end} } return false; } }
package java.lang; //import java.util.Set; public class StringDebugHelper{ public static class Equals{ public static String[] attention; public static boolean isInAttention(final String str){ if(attention==null) return false; for(int i = 0; i < attention.length; i++){ if(null != attention[i] && StringDebugHelper.Equals.equals(attention[i].value, str.value)) return true; } return false; } public static boolean equals(final char [] thiz,final char [] anotherString) { int n = thiz.length; if (n == anotherString.length) { char v1[] = thiz; char v2[] = anotherString; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } return false; } } }
import java.util.HashSet; import java.util.Set; public class StringDebugHelperTest{ public static void main(String[] args){ // to this before boot app { String[] st = new String[5]; st[0] = "java"; st[1] = "tsogvilin"; StringDebugHelper.Equals.attention = st; // } // app content: //"java".equals(new String("java")); "tsogvilin".equals(new String("tsogvilin")); } }
#compile javac -sourcepath main/src/ -d main/classes/ main/src/*.java javac -Xbootclasspath/p:main/classes -d test/classes/ test/src/*.java #run java -Xbootclasspath/p:main/classes -cp test/classes T java -Xbootclasspath/p:main/classes -cp test/classes StringDebugHelperTest
real exmaple :apktool:
#replace javac cmd: mv /usr/lib/jvm/java-8-openjdk-amd64/bin/javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac.real cat /usr/lib/jvm/java-8-openjdk-amd64/bin/javac #!/bin/sh /usr/lib/jvm/java-8-openjdk-amd64/bin/javac.real -Xbootclasspath/p:/home/z/hg_openjdk_java_net/jdk8u_jdk8u/str.eq.dbg/main/classes/ "$@"
Apktool/build.gradle: tasks.withType(JavaCompile) { options.compilerArgs += ["-Xlint:-options"] // add this: options.bootClasspath = "/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/home/z/hg_openjdk_java_net/jdk8u_jdk8u/str.eq.dbg/main/classes/" //add this }
//Apktool/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java: // to this before boot app { String[] st = new String[1]; st[0] = "resources.arsc"; //st[1] = "tsogvilin"; StringDebugHelper.Equals.attention = st; System.out.println("rrrrrrrrrrrrrrrrrr"); // }
java -Xbootclasspath/p:main/classes -cp /home/z/a/Apktool/brut.apktool/apktool-cli/build/libs/apktool-cli-all.jar -Duser.language=en -Dfile.encoding=UTF8 brut.apktool.Main d ~/a/game.v182815.apk -o ~/a/myoutdir
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73154.html
摘要:因此,對(duì)應(yīng)地我們可以翻譯這段二進(jìn)制字節(jié)碼為這樣的代碼注意,這段代碼并不能通過編譯,因?yàn)樵创a這一層是不允許直接繼承的,這個(gè)繼承過程只允許在編譯器內(nèi)部解語法糖的過程中被編譯器添加,添加之后的類才會(huì)有的訪問標(biāo)識(shí)符。 語法糖(Syntactic Sugar)的出現(xiàn)是為了降低我們編寫某些代碼時(shí)陷入的重復(fù)或繁瑣,這使得我們使用語法糖后可以寫出簡(jiǎn)明而優(yōu)雅的代碼。在Java中不加工的語法糖代碼運(yùn)行時(shí)可...
摘要:如感興趣,可移步手寫之基于動(dòng)態(tài)創(chuàng)建對(duì)象手寫之基于注解動(dòng)態(tài)創(chuàng)建對(duì)象今天將詳細(xì)介紹如何手寫依賴注入,在運(yùn)行過程中如何動(dòng)態(tài)地為對(duì)象的屬性賦值。完成后在中會(huì)有相關(guān)的包出現(xiàn)進(jìn)行注入前需要?jiǎng)?chuàng)建工廠,在運(yùn)行時(shí)從工廠中取出對(duì)象為屬性賦值。 前兩篇文章介紹了關(guān)于手寫Spring IOC控制反轉(zhuǎn),由Spring工廠在運(yùn)行過程中動(dòng)態(tài)地創(chuàng)建對(duì)象的兩種方式。如感興趣,可移步: 手寫Spring之IOC基于xml...
摘要:上一篇博客介紹了如何基于配置文件在運(yùn)行時(shí)創(chuàng)建實(shí)例對(duì)象,這篇博客將介紹基于注解方式怎樣實(shí)現(xiàn)對(duì)象的創(chuàng)建。方便測(cè)試,該類型分別創(chuàng)建兩個(gè)單例和多例的類型。注意這種為對(duì)象注入屬性值的方式耦合度較高,可根據(jù)情況使用。 上一篇博客介紹了如何基于xml配置文件在運(yùn)行時(shí)創(chuàng)建實(shí)例對(duì)象,這篇博客將介紹基于注解方式怎樣實(shí)現(xiàn)對(duì)象的創(chuàng)建。 廢話不多說,直接上代碼。 首先還是創(chuàng)建項(xiàng)目,由于這次不需要使用第三方的AP...
Spring作為Java Web最為流行的框架之一,其功能之強(qiáng)大,封裝細(xì)節(jié)之全面不用過多贅述。使用Spring的方式很簡(jiǎn)單,不需要關(guān)注細(xì)節(jié),把對(duì)象的創(chuàng)建和對(duì)象之間的關(guān)系都交給框架來管理,僅僅做好配置文件和實(shí)現(xiàn)具體的業(yè)務(wù)邏輯即可??梢哉fSpring為我們?cè)诰帉慗ava Web應(yīng)用時(shí)省去了大量重復(fù)的代碼,并且可以降低對(duì)象與對(duì)象之間的耦合度。但若只是知其然,而不知其所以然,在編程時(shí)也難免會(huì)遇到各種問題,...
IntelliJ IDEA 問題描述 IntelliJ IDEA 在 多窗口、多項(xiàng)目協(xié)作開發(fā)時(shí),MacBook Pro的散熱風(fēng)扇兇猛地轉(zhuǎn)動(dòng),相關(guān)配置如下: MacBook Pro 配置 MacBook Pro (Retina, 15-inch, Mid 2015) 型號(hào)名稱: MacBook Pro 型號(hào)標(biāo)識(shí)符: MacBookPro11,4 處理器名稱: Intel Core ...
閱讀 2938·2021-11-16 11:55
閱讀 2707·2021-09-29 09:34
閱讀 3627·2021-09-01 14:21
閱讀 3879·2019-08-29 12:36
閱讀 751·2019-08-26 10:55
閱讀 4126·2019-08-26 10:20
閱讀 1094·2019-08-23 18:19
閱讀 1255·2019-08-23 17:56