Android 反射,接口代理
简单的写一下,方便记忆
public class PayUtils implements InvocationHandler{
private void pay() {
Class<?> aClass = null;
Class<?> iClass = null;
try {
//反射类地址
aClass = Class.forName("*********");
//接口地址
iClass = Class.forName("*****.Listener");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (aClass != null && iClass != null) {
try {
//方法
Method method = aClass.getMethod("get", Context.class);
//获取实例
Object payObject = method.invoke(aClass, activity);
Class<?> payClass = payObject.getClass();
//获取需要方法
Method payMethod = payClass.getMethod("方法名", Activity.class, String.class, String.class, Bundle.class, iClass);
Bundle extra = new Bundle();
extra.putBoolean(PaymentManager.PAYMENT_KEY_IS_NO_ACCOUNT, true);
//代理 类加载器,接口class,回掉
Object o = Proxy.newProxyInstance(PayUtils.class.getClassLoader(), new Class[]{iClass}, this);
payMethod.invoke(payObject, activity, null, "传递值", extra, o);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//回掉返回
String name = method.getName();
if (name.equals("onSuccess")) {
} else if (name.equals("onFailed")) {
}
return null;
}
}