Почему эти функции абстрактны, где найти тело (конкретную реализацию) из них?

Скриншот

Я хочу знать реализацию функции getPackageInfo (потому что я хочу знать, где хранится пакет, на который они ссылаются), поэтому я пошел к этому, чтобы увидеть исходный код, но нашел там только абстрактный метод.

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

Где реализуется метод?

Реализация метода 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; } 

Вы можете посмотреть здесь

Если вы просто посмотрите на документы для PackageManager , вы увидите, что у него есть прямой подкласс MockPackageManager . Это конкретный класс, поэтому он должен содержать реализацию метода getPackageInfo . Но если вы посмотрите ближе, в нем говорится, что все методы класса бросают UnsupportedOperationException !

В документах говорится, что вы сами реализуете это поведение, не так ли? Затем сделать его! Это точка абстрактных методов, позволяющая людям создавать пользовательские реализации!

Но почему ваш код работает?

Я думаю, наиболее вероятным объяснением является то, что метод getPackageManager в вашем коде возвращает анонимный класс, который расширяет MockPackageManager или MockPackageManager и обеспечивает реализацию там. Вы можете посмотреть источник getPackageManager помощью getPackageManager управления + щелчок на имени метода в Android Studio на Windows. В OS X это должно быть команда + клик.