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)
3 Réponses :
Il existe une spéciale java.lang.reflect. Array code>
classe. longueur code> n'est pas un champ normal. Pour y accéder, il existe une méthode spéciale
getLength code>. P>
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 code> n'est pas un champ normal, ce qui explique le
java.lang.nosuchfieldException code> ...
@ Brimborium- Y a-t-il une citation pour pourquoi longueur code> est "Aucun champ normal?" Selon les types de matrices JLS agir comme si
longueur code> é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.
Je pense que cela pourrait être un bogue dans la mise en œuvre de la JVM. Voici mon raisonnement: p>
selon La documentation de selon Le Spécification de la langue Java , chaque tableau a puisque ce champ est déclaré comme ayant le nom Fait intéressant maintenant, le J'espère que cela vous aidera! P> class.gefield code>
, getfield code> devrait, dans la section (1) de son algorithme de recherche, trouvez
longueur code> 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." P> LI>
longueur code> déclarée "la longueur du champ final public, qui contient le nombre de composants du tableau" P> LI>
longueur code>,
getfield code> devrait jeter un
SecurityException code> comme documenté ou doit renvoyer le
champ code> objet. p> li>
ol>
Class.getfields Code>
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 code>, de sorte que cela pourrait être une mauvaise lecture sur ma part ou juste une mauvaise documentation. P>
Cela peut également être un bug dans les JLS;) mais c'est vraiment étrange.
en Java, les tableaux sont simplement des objets simples. L'objet n'a pas de champ appelé longueur em>. C'est pourquoi la réflexion échoue. p>
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. p>
de la documentation ... p>
La longueur d'une matrice ne fait pas partie de son type. P>
blockQuote>