項(xiàng)目需求:app含有廣告sdk杂靶,在上架個(gè)別應(yīng)用市場時(shí)會被拒,產(chǎn)品希望在打包時(shí)一些渠道包把廣告sdk剝離出來(內(nèi)心是哭泣的)。
方法一:每次打包刪除jar包谜叹,刪除與該jar包相關(guān)的代碼類右锨、接口等等~
記錄完成括堤,謝謝大家
哈哈 開個(gè)玩笑,言歸正傳绍移,以上是我一開始的想法悄窃,最笨最笨的方法,沒有之一蹂窖,下面進(jìn)入主題轧抗,用到的東西自然跟標(biāo)題相關(guān),反射和動態(tài)代理瞬测。
反射其實(shí)我是知道用過的横媚,但是項(xiàng)目中沒實(shí)際用過,動態(tài)代理只是聽著耳熟月趟,用了一天時(shí)間簡單去了解了下灯蝴,所以這篇文章也只記錄一個(gè)知識的皮毛。
首先說下反射孝宗,我現(xiàn)在接觸到的反射分以下幾種:
1,調(diào)用某個(gè)類中的某個(gè)方法
try {
Class?cls = Class.forName("com.app.test.Mianactivity");
//Class?cls = Class.forName("com.app.test.Mianactivity$ADListener");//調(diào)用內(nèi)部類 注意類中$ 分隔
????Object?obj=cls.newInstance(); ?//創(chuàng)建一個(gè)實(shí)例對象
? ? Method method = cls.getMethod("add", String.class);//獲取方法
? ? method.invoke(obj, “test”);
}catch (Exception e) {
e.printStackTrace();//直接catch住所有的Exception ?
}
2,調(diào)用某個(gè)類中的靜態(tài)方法
?反射調(diào)用Mianactivity類中add方法
add方法中的參數(shù)是個(gè)String
invoke的第一個(gè)參數(shù)傳null就行穷躁,至于為什么我還不清楚。因妇。
try {
? ? Class cls = Class.forName("com.app.test.Mianactivity");
? ? Method method = cls.getMethod("add", String.class);
? ? method.invoke(null, true);
}catch (Exception e) {
e.printStackTrace();//直接catch住所有的Exception ?
}
3,調(diào)用某個(gè)類中的構(gòu)造方法
Class cls = Class.forName("com.test.splash.SplashAD");
Constructor csr = cls.getConstructor(Activity.class, ViewGroup.class, View.class, String.class, int.class);
//調(diào)用有參構(gòu)造
csr.newInstance(this, relativelayout, mTvSkipView, "111", 0);
最簡單最常用的就是這幾種(上面附代碼)
接下來重點(diǎn)說下坑了我一下午的動態(tài)代理
主要是想實(shí)現(xiàn)動態(tài)代理接口问潭,那這樣子 我的類就不需要直接實(shí)現(xiàn)或者內(nèi)部類實(shí)現(xiàn)它的接口了,直接貼圖
invoke方法中 ? ?Method中包含當(dāng)前接口要回調(diào)的方法婚被,object[]args中包含當(dāng)前方法中參數(shù)狡忙,從args[0]依次往后取,跟接口中方法參數(shù)的排序一樣摔寨,如果當(dāng)前Method對象的method中沒有參數(shù)去枷,那args也是null
其他的不多說話,對照圖依次套用就行是复,原理我日后再研究删顶。。淑廊。逗余。