概述
使用放射方式去实现一个接口
场景:
假设想使用 MediaScannerConnection 类的 scanFile 静态方法,但需传入参数OnScanCompletedListener
使用如下反射方式便可.
Class<?> MediaScanner = null;
Class<?> OnScanCompletedListener = null;
try {
MediaScanner = Class.forName("android.media.MediaScannerConnection");
OnScanCompletedListener = Class.forName("android.media.MediaScannerConnection$OnScanCompletedListener");
Method scanFileMethod = MediaScanner.getDeclaredMethod("scanFile", Context.class, String[].class,
String[].class, OnScanCompletedListener);
Object listener = Proxy.newProxyInstance(OnScanCompletedListener.getClassLoader(),
new Class[] { OnScanCompletedListener }, new OnScanCompletedListenerImpl());
scanFileMethod.invoke(null, new Object[] {mContext, paths, mimeTypes, listener});
} catch (Exception e) {
Log.e(TAG, e.toString(), e);
}
public class OnScanCompletedListenerImpl implements InvocationHandler {
private onScanCompletedCallback mCallback;
public OnScanCompletedListenerImpl(onScanCompletedCallback callback) {
mCallback = callback;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
Log.d(TAG, "invoke, method: " + method.getName());
if("onScanCompleted".equals(method.getName())) {
String path = (String) args[0];
Uri uri = (Uri) args[1];
Log.d(TAG, "invoke, args, path: " + path + ", uri: " + uri);
mCallback.onScanCompleted(path, uri);
}
} catch (Exception e) {
Log.e(TAG, e.toString(), e);
}
return proxy;
}
}
参考链接:
How to implement an interface using Reflection
最后
以上就是冷傲丝袜为你收集整理的【Java】【反射】 使用反射方式去实现一个接口的全部内容,希望文章能够帮你解决【Java】【反射】 使用反射方式去实现一个接口所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复