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

来源:互联网 发布:工业数据采集的重要性 编辑:程序博客网 时间:2024/04/29 19:48

使用放射方式去实现一个接口


场景:

假设想使用 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







0 0
原创粉丝点击