12
votes

Obtenir le champ "longueur" dans un tableau Java en utilisant la réflexion

10
10
23
Exception in thread "main" java.lang.NoSuchFieldException: length
    at java.lang.Class.getField(Class.java:1520)
    at Test.main(Test.java:9)

0 commentaires

3 Réponses :


10
votes

Il existe une spéciale java.lang.reflect. Array classe. longueur n'est pas un champ normal. Pour y accéder, il existe une méthode spéciale getLength .


4 commentaires

Bien que cela permet à cette réflexion fonctionne correctement, je pense que cela ne répond pas à la question. La question de l'OP, au moins comme je le lis, c'est pourquoi le code ci-dessus échoue.


@ Templatetypedef Ça fait en fait. Il dit que longueur n'est pas un champ normal, ce qui explique le java.lang.nosuchfieldException ...


@ Brimborium- Y a-t-il une citation pour pourquoi longueur est "Aucun champ normal?" Selon les types de matrices JLS agir comme si longueur était déclaré comme champ public, et bien que le bytecode soit différent pour les recherches sur le terrain, je ne trouve rien spécifiquement dire "la longueur de la matrice est différente".


La réponse des liaisons de Brimborium vers un thread de SO qui fournit des citations pour cela.



5
votes

Je pense que cela pourrait être un bogue dans la mise en œuvre de la JVM. Voici mon raisonnement:

  1. selon La documentation de class.gefield , getfield devrait, dans la section (1) de son algorithme de recherche, trouvez longueur s'il a été déclaré comme un champ public: "Si C déclare un champ public avec le nom spécifié, c'est le champ à réfléchir."

  2. selon Le Spécification de la langue Java , chaque tableau a longueur déclarée "la longueur du champ final public, qui contient le nombre de composants du tableau"

  3. puisque ce champ est déclaré comme ayant le nom longueur , getfield devrait jeter un SecurityException comme documenté ou doit renvoyer le champ objet.

    Fait intéressant maintenant, le Class.getfields Méthode mentionne explicitement que "le champ de longueur implicite pour la classe Array n'est pas reflété par cette méthode. Le code d'utilisateur doit utiliser les méthodes de la matrice de classe pour manipuler des tableaux." Cela ne semble pas parallèlement getfield , de sorte que cela pourrait être une mauvaise lecture sur ma part ou juste une mauvaise documentation.

    J'espère que cela vous aidera!


1 commentaires

Cela peut également être un bug dans les JLS;) mais c'est vraiment étrange.



0
votes

en Java, les tableaux sont simplement des objets simples. L'objet n'a pas de champ appelé longueur . C'est pourquoi la réflexion échoue.

S'il vous plaît voir http://docs.oracle. COM / Javase / Spécifications / JLS / SE7 / HTML / JLS-10HTML Pour plus d'informations sur la manière dont les tableaux sont implémentés.

de la documentation ...

La longueur d'une matrice ne fait pas partie de son type.


0 commentaires