隐藏类 Singleton
2020-04-25 本文已影响0人
一个追寻者的故事
Android 中有两类API,不能通过SDK访问。
- com.android.internal 中的API,称之为 Internal API
- 被标记为 @hide 的属性、类和方法,这是被隐藏的API,称之为 Hidden API
这些API 隐藏的可能原因:
1、涉及系统安全,所以不想让开发人员直接使用。
2、这些hide的API不保证往后兼容。
为什么这两类API不能通过SDK访问?
sdk/platforms/android-version/android.jar 被进行了处理,在这个 jar 中默认移除了所有这些隐藏的 类或者方法,我们开发时无法访问到。
为什么使用反射就能够调用这些类和方法?
我们在Android 设备上,使用的并不是跟我们SDK中相同的jar,运行时会加载 /system/framework/framework.jar framework.jar 和 android.jar 唯一的区别是有没有移除 internal API 和 hidden API
Singleton
具体位置:
frameworks/base/core/java/android/util/Singleton.java
package android.util;
/**
* Singleton helper class for lazily initialization.
*
* Modeled after frameworks/base/include/utils/Singleton.h
*
* @hide
*/
public abstract class Singleton<T> {
private T mInstance;
protected abstract T create();
public final T get() {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
}
这是一个 单例 工具类 ,我们写个例子使用一下这个工具。
定义实体类
public class Person {
public int age;
public String name;
}
使用
Singleton<Person> singleton = new Singleton<Person>() {
@Override
Person create() {
return new Person();
}
};
Person person = singleton.get();
Person person1 = singleton.get();
Person person2 = singleton.get();
Person person3 = singleton.get();
Person person4 = singleton.get();
Person person5 = singleton.get();
结果
参考
https://blog.csdn.net/hp910315/article/details/77749414
扩展阅读:
https://commonsware.com/blog/2018/01/18/think-hard-about-hide.html
https://github.com/anggrayudi/android-hidden-api