您的位置:首页 > 编程语言 > Java开发

【Java】【反射】 使用反射方式去实现一个接口

2016-05-07 17:26 555 查看
使用放射方式去实现一个接口

场景:

假设想使用 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: