接口的实现方式,一般都是通过implements方式,直接重写接口的方法即可,今天给大家介绍另一种方式---代理,来实现接口,首先创建一个接口
public interface AnimationInterface {
void start();
void stop();
}
声明了两个方法start和stop,然后就是通过代理的方式,来实现这个接口,代码如下
public class MainActivity extends AppCompatActivity implements InvocationHandler {
private AnimationInterface mAniamationInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAniamationInterface = (AnimationInterface) Proxy.newProxyInstance(AnimationInterface.class.getClassLoader(), new Class[]{AnimationInterface.class}, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Method m = getClass().getDeclaredMethod(method.getName(), method.getParameterTypes());
return m.invoke(this, args);
}
public void stop() {
Log.d("dyj", "stop");
}
public void start() {
Log.d("dyj", "start");
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.start:
mAniamationInterface.start();
break;
case R.id.stop:
mAniamationInterface.stop();
break;
default:
Log.d("dyj", "default");
}
}
}
因为需要通过代理来实现,所以MainActivity需要实现InvocationHandler这个接口并实现AnimationInterface里面的方法(这里的实现不是通过implements实现的),最后通过Proxy.newProxyInstance拿到代理对象就可以了。然后通过代理对象即可调用接口的方法(即MainActivity中的实现)。
这种方式可以满足一些非常规的需求,比如要实现的某个接口,不在同一个app中,此时就可以通过这种方式来实现。
demo地址:https://github.com/dyjAndroid/ProxyDemo