30 votes

Pourquoi une méthode protégée Android:onClick dans une activité fonctionne-t-elle réellement ?

Supposons que vous définissiez android:onClick="doClick" dans votre Activity comme

protected void doClick(View view) { }

El documentation déclare que

Ce nom doit correspondre à une méthode publique qui prend exactement un paramètre de type View.

Il s'agit d'une exigence donnée du système sous-jacent Class.getMethod() qui ne trouve que les méthodes publiques comme la méthode documentation déclare qu'il

Retourne un Method qui reflète la méthode membre publique spécifiée de la classe ou de l'interface représentée par cet objet Class objet.

Alors comment est-il possible que cette mise en œuvre, qui ne devrait pas fonctionner du tout, fonctionne sur certains appareils et émulateurs, alors qu'elle ne fonctionne pas sur d'autres appareils utilisant les mêmes niveaux d'API ?

0 votes

J'ai été intéressé par la question, je peux me tromper complètement mais je pense que cela fonctionne avec protected en raison du fait que si getMethod() ne trouve pas de méthode correspondante dans une classe donnée, il poursuit sa recherche de manière récursive dans la super classe.

1 votes

Ça ne devrait pas fonctionner idéalement. J'ai vérifié le code source et ils ne rendent pas la méthode accessible, ce qui est nécessaire pour accéder aux méthodes non publiques en utilisant la réflexion, peut-être qu'ils ont une implémentation différente de ceci dans une version différente de l'API.

0 votes

Je me pencherais sur la méthode DeclaredOnClickListener et sur les différences entre le cadre et les implémentations de la bibliothèque de support : github.com/aosp-mirror/platform_frameworks_base/blob/master/ et : github.com/reverseengineeringer/com.twitter.Android/blob/master/

0voto

Regis Points 11

Selon " Les tutoriels Java™ " : Le modificateur protected spécifie que le membre ne peut être accédé qu'à l'intérieur de son propre package (comme avec package-private) et, en outre, par une sous-classe de sa classe dans un autre package.

2 votes

Quel est le lien entre cette réponse et la question ? Protégé doClick décrite dans la question n'est pas accessible à partir d'une classe du même paquet ou d'une sous-classe ; on y accède en quelque sorte à partir des classes du SDK Android.

0voto

tynn Points 17673

J'ai débogué les implémentations particulières. La partie pertinente du code se trouve dans la section Bibliothèque de soutien en utilisant Class.getMethod() .

Comme indiqué dans la documentation, cette méthode ne trouve que les méthodes membres publiques et se comporte correctement. Pour une raison quelconque, tous les modificateurs des méthodes protégées déclarées de la classe Activity (ce sont onCreate() y doClick() ) sont fixés à 1 ce qui signifie qu'ils sont en fait publics.

Je n'ai pu observer ce comportement qu'en créant le debug construire avec un Mac. La raison de ce phénomène reste donc une question ouverte, à laquelle j'essaie de trouver une réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X