2016-10-18 1 views
1

Alors récemment, j'ai essayé de simplement changer un nom de classe et je ne peux tout simplement pas. Voici mon code InjectorClassNode https://0bin.net/paste/9REMNddwqjm8vRms#hyr4RG3BI36J+kRwMfC2pJoXb7I3+7AwKKzYhhXZQfwASM Java code postal muniplation changer un nom de classe

MethodClassNode https://0bin.net/paste/UwKCvIG+cliZAYja#gILvBXxaQ1CyfQ602c6h7UE9dimhlo6q+GbKIwZ6m8B

Maintenant, quand je le lance, il jette une classe non trouvée pour une raison stuiped « com/kirelcodes/froid/Tâche » est dans la liste des importations et je ne sais pas pourquoi J'aimerais obtenir de l'aide

Répondre

0

Dans votre solution, vous ne renommez la classe que dans un seul fichier. Les autres classes ne seront pas averties du changement de nom et lanceront "ClassNotFoundException".

Il serait préférable de renommer la classe après avoir effectué votre modification avec un Remapper.

+0

J'ai effectivement mis à jour le problème est qu'à la fin il y a une importation qui est inutile pour le nom original – NacOJerk

+1

@NacOJerk: avez-vous lu et tenté de comprendre [ma réponse] (http://stackoverflow.com/ a/40152920/2711488)? Votre code ne fait pas ce que vous voulez, c'est-à-dire qu'il ne renomme rien. Les instructions 'import' sont des artefacts de code source purs qui n'apparaissent pas dans le bytecode. – Holger

+0

Holger a raison Nac. –

1

Le paramètre signature de toutes les méthodes visit… fait référence à la signature générique , qui est pertinente pour la réflexion que lors de l'exécution. Vous devriez avoir remarqué, que la méthode de visite de classe a un paramètre name qui est beaucoup plus pertinent pour le nom de la classe, qui est ce que vous voulez changer.

Pour les membres, il est pas évident que le paramètre desc est ce que la spécification JVM appelle la « signature », mais au moins, l'API ASM est cohérente pour appeler les paramètres de description signature générique signature. C'est pourquoi le signature peut être null, ce qui indique qu'il n'y a pas de types génériques impliqués. Pour ce que vous voulez réaliser, vous devez adapter le paramètre desc.

En outre, notez que lors du traitement des instructions, vous devez non seulement prendre en compte la conversion du type de propriétaire des membres référencés, mais aussi que les types des membres doivent également être adaptés. Il n'est pas utile de nommer les paramètres arg0, arg1, arg2, arg3, arg4 dans ce contexte, soit dit en passant. Il se peut qu'il y ait des références de type supplémentaires que vous ne traitez pas, par ex. ldc instructions peut pousser une référence Class, mais je ne sais pas si cela compte pour ce cas particulier.