为什么这些函数是抽象的,在哪里找到它们的主体(具体实现)?

时间:2015-12-25 06:04:21

标签: java android android-source

Screenshot

我想知道函数getPackageInfo的实现(因为我想知道它们所指的包存储在哪里),所以我去了this看源代码,但只是在那里找到了一个抽象的方法。

public abstract PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException;

该方法的实施在哪里?

2 个答案:

答案 0 :(得分:2)

getPackageInfo方法的实现在com.android.server.pm.PackageManagerService

 @Override
public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
    // reader
    synchronized (mPackages) {
        PackageParser.Package p = mPackages.get(packageName);
        if (DEBUG_PACKAGE_INFO)
            Log.v(TAG, "getPackageInfo " + packageName + ": " + p);
        if (p != null) {
            return generatePackageInfo(p, flags);
        }
        if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
            return generatePackageInfoFromSettingsLPw(packageName, flags, userId);
        }
    }
    return null;
}

你可以查看here

答案 1 :(得分:-1)

如果您只查看PackageManager的文档,您会看到它有一个名为MockPackageManager的直接子类。这是一个具体的类,因此它必须包含方法getPackageInfo的实现。但如果你仔细观察,它会说类中的所有方法都抛出UnsupportedOperationException

在文档中,它告诉您自己实现这些行为,不是吗?那就做吧!这是抽象方法的重点,允许人们进行自定义实现!

但为什么你的代码有效?

我想最可能的解释是代码中的getPackageManager方法返回一个扩展PackageManagerMockPackageManager的匿名类,并在那里提供实现。您可以通过控制+在Windows上的Android Studio中单击方法名称来查看getPackageManager的来源。在OS X上应该是命令+单击。