利用动态代码反射接口

背景

最近在项目中遇到了这样一个需求,要开发一个包含多家上报SDK的SDK,但是对于不同的集成方,要提供的上报SDK数量不一样,如果要统一初始化多家上报SDK,那么就意味着有的SDK可能没有,其中的类只能利用反射来获取,因此:就需要利用反射来反射出其要传递的接口,然后获取接口里面的回调

代码如下

写了一个Demo如下:

首先我们先写一个类与其中的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package lab.mon.actlab.java.reflectInter;
class ReflectClass {
interface ReflectInter {
public void onReflect();
}
public ReflectInter inter = null;
void addInter(ReflectInter reflectInter) {
inter = reflectInter;
invoInter();
}
private void invoInter() {
inter.onReflect();
}


}

然后po上动态代理获取接口代理的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ReflectMain {
Class<?> obs = null;
InterProxy.ProxyCallback callback = new InterProxy.ProxyCallback() {
@Override
public void onInvoke() {
Log.d("totolog", "invokeSuccess");
}
};

public void reflectinterMain() {
try {
Class<?> reflectClass = Class.forName(ReflectClass.class.getName());
obs = Class.forName(ReflectClass.ReflectInter.class.getName());
Method method = reflectClass.getDeclaredMethod("addInter", obs);
Object listener = Proxy.newProxyInstance(obs.getClassLoader(), new Class[]{obs}, new InterProxy(callback));
method.setAccessible(true);
Object classObject = reflectClass.newInstance();
method.invoke(classObject, new Object[]{listener});
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();

}
}


}

class InterProxy implements InvocationHandler {
public ProxyCallback callback = null;

interface ProxyCallback {
void onInvoke();
}

InterProxy(ProxyCallback callback) {
this.callback = callback;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) {
if ("onReflect".equals(method.getName())) {
callback.onInvoke();
}

return proxy;
}
}

这里我们看到,调用处完全没有引入ReflectClass相关的路径,但是我们可以调用成功方法。

ReflectClass.ReflectInter.class.getName()我这里面做是为了方便,可以写成完整类和接口名。

谢谢您的鼓励~