찾다

 >  Q&A  >  본문

android-studio - Android 반사 획득 방법 ClassNotFoundException

나는 Bundle中持有的mMap集合.
bundle类中,有getMap()方法可以获取,但是被标记为hide을 얻고 싶어서 리플렉션을 사용하여 얻습니다.

으아악

이것은 제가 테스트한 코드입니다. 이전에 메소드를 직접 호출한 후 예외가 발생했습니다.

으아악

소스코드에서 본 메소드는 다음과 같습니다. (메소드명만 복사됩니다.)

으아악

그 중에서도isParcelled(),getPairValue()也是被标记为hide 구할 수 있는데 왜인지 묻고 싶습니다.

SDK 버전 때문인가 봅니다. 제 휴대폰은 sdk = 23,我编译的版本为25 23 이후에 추가된 메소드가 아닌가 싶습니다. SDK 버전 차이 테스트 방법이 있는지 아니면 다른 방법이 있는지 궁금합니다. 이유.

PHP中文网PHP中文网2753일 전1174

모든 응답(2)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-05-16 13:26:23

    Api23과 Api25의 번들 소스 코드를 비교했는데 getMap에 대한 명확한 정보가 없었습니다.
    그런 다음 Api16과 Api25의 번들 소스 코드를 비교한 결과 아래 그림의 노란색 블록에 표시된 대로 단서를 찾았습니다.

    Api25에서는 Bundle이 BaseBundle을 확장하지만 Api16에서는 확장되지 않으며 양쪽에서 사용되는 데이터 구조도 변경되었음을 알 수 있습니다.

    Api25의 BaseBundle을 살펴보겠습니다. 실제로 getMap이 있습니다.

    으아악

    그런 다음 Api23의 BaseBundle에서 getMap을 검색해 보겠습니다. 결과는 다음과 같습니다.

    분명히 Api23에는 Bundle이나 해당 상위 클래스인 BaseBundle에 getMap 메서드가 없으므로 반사는 불가능합니다. 어느 쪽이든 조정됩니다.

    회신하다
    0
  • 为情所困

    为情所困2017-05-16 13:26:23

    @hide는 javadoc 태그에 속합니다. Bundle 소스 코드가 jar 패키지로 컴파일되면 생성된 jar 패키지는 개발자용이므로 IDE에 직접 전달할 수 없습니다. 번들 객체에 대한 참조는 번들 클래스의 hide 메소드를 직접 호출합니다. 이는 SDK 컴파일 버전과 다르지 않습니다.
    Android에 전체적으로 익숙해지면 Android 소스 코드를 컴파일하여 자신만의 android.jar 패키지를 생성할 수 있습니다. 예를 들어 여기에는 더 많은 카메라 개발이 있으며 우리는 많은 카메라 메소드를 숨겼습니다. 매번 리플렉션을 통해 hide 메소드를 호출하고 싶지 않기 때문에 android.jar 패키지 전체 세트를 직접 컴파일했습니다. 카메라에 숨겨진 메소드는 IDE에서 직접 호출할 수 있습니다.

    회신하다
    0
  • 취소회신하다