1. 程式人生 > >java反射和動態代理實現介面記錄

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

其他的不多說話,對照圖依次套用就行,原理我日後再研究。。。。