java反射和動態代理實現介面記錄
專案需求:app含有廣告sdk,在上架個別應用市場時會被拒,產品希望在打包時一些渠道包把廣告sdk剝離出來(內心是哭泣的)。
方法一:每次打包刪除jar包,刪除與該jar包相關的程式碼類、介面等等~
記錄完成,謝謝大家
哈哈 開個玩笑,言歸正傳,以上是我一開始的想法,最笨最笨的方法,沒有之一,下面進入主題,用到的東西自然跟標題相關,反射和動態代理。
反射其實我是知道用過的,但是專案中沒實際用過,動態代理只是聽著耳熟,用了一天時間簡單去了解了下,所以這篇文章也只記錄一個知識的皮毛。
首先說下反射,我現在接觸到的反射分以下幾種:
1,呼叫某個類中的某個方法
try {
Class cls = Class.forName("com.app.test.Mianactivity");
Object obj=cls.newInstance(); //建立一個例項物件
Method method = cls.getMethod("add", String.class);//獲取方法
method.invoke(obj, “test”);
}catch (Exception e) {
e.printStackTrace();//直接catch住所有的Exception
}
2,呼叫某個類中的靜態方法
反射呼叫Mianactivity類中add方法
add方法中的引數是個String
invoke的第一個引數傳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,呼叫某個類中的構造方法
Class cls = Class.forName("com.test.splash.SplashAD");
Constructor csr = cls.getConstructor(Activity.class, ViewGroup.class, View.class, String.class, int.class);
//呼叫有參構造
csr.newInstance(this, relativelayout, mTvSkipView, "111", 0);
最簡單最常用的就是這幾種(上面附程式碼)
接下來重點說下坑了我一下午的動態代理
主要是想實現動態代理介面,那這樣子 我的類就不需要直接實現或者內部類實現它的介面了,直接貼圖
invoke方法中 Method中包含當前介面要回調的方法,object[]args中包含當前方法中引數,從args[0]依次往後取,跟介面中方法引數的排序一樣,如果當前Method物件的method中沒有引數,那args也是null
其他的不多說話,對照圖依次套用就行,原理我日後再研究。。。。