@SystemApi @hide @NonNull @TargetApi
2015-10-10 11:35
253 查看
Android中SystemApi hide NonNull TargetApi
SystemApi hide PrivateApi
NonNull TargetApi
参考信息
在Android源码中,有两种类型的API无法通过标准的SDK进行访问
如下图所示;
位于com.android.internal包中的
类/方法 被 @hide修饰的
值得注意的是:隐藏的方法(使用@hide修饰的)仍然可以通过java 反射机制进行访问;@hide标识只是javadoc的一部分(也是Android doc的一部分),所以@hide修饰符仅仅指示了method/class/field 不会被暴露到API中。
例如ActivityManager.java 中的方法checkUidPermission 是被@hide修饰的
但是我们可以通过java的反射机制来访问
下面来看看@SystemApi 和@hide的不同之处
如上文所示:使用@hide修饰的method/class/field,我们仍然何以通过java反射机制进行访问。
但是使用@SystemApi修饰的method/class/field,无法通过java 反射机制进行访问(会触发invocationTargetException异常)
列出源码
TargetApi
NonNull
TargetApi的常见用法是指定当前class/method/field所使用的api版本,也就是所谓的android 4.4/5.0/5.1/
NonNull常见用于修饰参数,用于表明该参数不为空!
Stackoverflow SystemApi
Stackoverflow @hide
SystemApi hide PrivateApi
NonNull TargetApi
参考信息
Android中@SystemApi @hide @NonNull @TargetApi
我们时常在Android源代码中看到的注释,如SystemApi hide NonNull TargetApi 那么它呢么具体代表什么意思?@SystemApi @hide @PrivateApi
有关@SystemApi的信息可以首先参见这个链接 ;@SystemApi 是 @PrivateApi的别名;使用@hide标记的API可以不使用@SystemApi进行标;但是当使用@SystemApi标记的API则必须使用@hide在Android源码中,有两种类型的API无法通过标准的SDK进行访问
如下图所示;
位于com.android.internal包中的
类/方法 被 @hide修饰的
值得注意的是:隐藏的方法(使用@hide修饰的)仍然可以通过java 反射机制进行访问;@hide标识只是javadoc的一部分(也是Android doc的一部分),所以@hide修饰符仅仅指示了method/class/field 不会被暴露到API中。
例如ActivityManager.java 中的方法checkUidPermission 是被@hide修饰的
/** @hide */ public static int checkUidPermission(String permission, int uid) { try { return AppGlobals.getPackageManager() .checkUidPermission(permission, uid); } catch (RemoteException e) { // Should never happen, but if it does... deny! Slog.e(TAG, "PackageManager is dead?!?", e); } return PackageManager.PERMISSION_DENIED; }
但是我们可以通过java的反射机制来访问
Class c; c = Class.forName("android.app.ActivityManager"); Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class}); Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});
下面来看看@SystemApi 和@hide的不同之处
如上文所示:使用@hide修饰的method/class/field,我们仍然何以通过java反射机制进行访问。
但是使用@SystemApi修饰的method/class/field,无法通过java 反射机制进行访问(会触发invocationTargetException异常)
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); Method method = manager.getClass() .getMethod("getPrivilegedConfiguredNetworks"); List<WifiConfiguration> configs = (List<WifiConfiguration>)method.invoke(manager);
列出源码
/** * Start AccessPoint mode with the specified * configuration. If the radio is already running in * AP mode, update the new configuration * Note that starting in access point mode disables station * mode operation * @param wifiConfig SSID, security and channel details as * part of WifiConfiguration * @return {@code true} if the operation succeeds, {@code false} otherwise * * @hide Dont open up yet */ public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { try { mService.setWifiApEnabled(wifiConfig, enabled); return true; } catch (RemoteException e) { return false; } } /** @hide */ @SystemApi public List<WifiConfiguration> getPrivilegedConfiguredNetworks() { try { return mService.getPrivilegedConfiguredNetworks(); } catch (RemoteException e) { return null; }
@NonNull @TargetApi
TargetApi & NonNull如下图所示:TargetApi
NonNull
TargetApi的常见用法是指定当前class/method/field所使用的api版本,也就是所谓的android 4.4/5.0/5.1/
NonNull常见用于修饰参数,用于表明该参数不为空!
参考信息
github rename PrivateApi to SystemApiStackoverflow SystemApi
Stackoverflow @hide
相关文章推荐
- Algorithm 4th environment setup
- MySQL删除重复记录只保留一条
- 个人电脑端口完全解析
- SQL注入——原理讲解
- 异常处理----Throwable类
- CSS尺寸和字体单位-em、px还是%
- cocos2dx 翻牌效果
- ListView自定义后,在onItemClick中getChildAt返回null问题
- overload,override,overwrite
- java设计模式之工厂模式
- AsyncTask实现断点续传
- C#鼠标右键弹出菜单
- Android学习文档之获取内存大小
- Andrew机器学习课程笔记(4)—— 异常检测
- unity基础知识大纲
- gulp的学习使用
- 使用CXF编写简单客户端与服务端
- android开发知识块总结
- AsyncTask实现断点续传
- 实验一