隐藏类 Singleton

2020-04-25  本文已影响0人  一个追寻者的故事

Android 中有两类API,不能通过SDK访问。

这些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

上一篇下一篇

猜你喜欢

热点阅读