J'essaie de générer une signature de méthode à partir d'un java.lang.reflect.Method. La partie de la signature (type générique) est délicate en tant qu'api de réflexion pour obtenir l'information de type et la transformer en ce que les besoins asm n'est PAS simple. Connaissez-vous un code qui existe déjà?Génération de bytecode Java avec les informations de signature génériques de reflect.Method
Répondre
Je suggère d'utiliser une bibliothèque existante comme:
Je ne suis pas au courant d'un outil qui fait automatiquement. J'utiliserais probablement la classe org.objectweb.asm.util.ASMifierClassVisitor pour comprendre la relation entre les signatures et les appels API ASM.
Pour une classe contenant ce code:
public void foo1(Object o1, String s2) {
}
... l'outil va générer:
mv = cw.visitMethod(ACC_PUBLIC, "foo1",
"(Ljava/lang/Object;Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitInsn(RETURN);
mv.visitMaxs(0, 3);
mv.visitEnd();
Pour ce code:
public static final String[] foo2() {
return null;
}
... il va générer :
mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL + ACC_STATIC,
"foo2", "()[Ljava/lang/String;", null, null);
mv.visitCode();
mv.visitInsn(ACONST_NULL);
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 0);
mv.visitEnd();
Il ya des notes sur method signatures in the FAQ et il est utile si vous comprenez Java class nomenclature.
Notez que l'API ASM peut également être utilisée pour transformer un java.lang.reflect.Method en org.objectweb.asm.commons.Method. Puisque vous pouvez get the class à partir du java.lang.reflect.Method, vous pouvez utiliser ClassVisitor s/MethodVisitor s à inspect the methods.
Je pense que j'essayais de faire quelque chose de très similaire (Generating methods with generic types with Asm bytecode generator (ClassWriter)).
De visitMethod de classe visiteur, je vois cette méthode comme:
public List<String> foobar(List<Integer> args, List<Boolean> args2);
produira la description comme:
(Ljava/util/List;Ljava/util/List;)Ljava/util/List;
(comme prévu, sans génériques info)
et signature comme :
(Ljava/util/List<Ljava/lang/Integer;>;Ljava/util/List<Ljava/lang/Boolean;>;)Ljava/util/List<Ljava/lang/String;>;
(avec les génériques ajoutés)
donc il devrait être raisonnablement simple de générer une signature générique pour augmenter la description non générique. C'est assez similaire à la façon dont les informations génériques sont ajoutées dans la source, à l'exception des bizarreries introduites par le traitement des types primitifs à un seul caractère.
Je ne l'ai pas encore essayé, mais étant donné que visitMethod() de ClassWriter prend également la signature, j'espère que cela fonctionnera. :)
Pour ce que cela vaut, alors que cela devrait apparemment fonctionner, il ne semble pas. Le problème est que ASM lui-même l'ajoute, et peut le voir, mais les méthodes de réflexion de la JVM ne semblent pas être trouvées pour une raison quelconque. : - / – StaxMan
Essayez d'utiliser printemps-asm bibliothèque (par exemple Type.GetType (String.class))
- 1. Génération de signature numérique
- 2. Java génériques problème de conception
- 3. Compilation Java Bytecode
- 4. Accélération d'une requête SQL avec des informations de données génériques
- 5. Du plaisir avec les génériques Java
- 6. Problème avec les génériques en Java
- 7. Java génériques (effacement de type)
- 8. Génération de partitions en Java
- 9. Génériques Java
- 10. non-concordance de type avec les génériques
- 11. Sécurité de type, génériques Java et interrogation
- 12. Génériques Java
- 13. Instrumentation bytecode générant une erreur java verifier
- 14. Équivalents bytecode Java pour ilasm/ildasm
- 15. Utilisation de génériques avec les collections jakarta commons Buffer
- 16. Quelles sont les différences entre LLVM et java bytecode?
- 17. Problème avec le modèle Observateur et les génériques en Java
- 18. Java: Conception avec Singletons et génériques
- 19. Automatisation de la génération de fichiers de règles Java
- 20. génériques java - méthode de retour type
- 21. Génération de métadonnées avec XSLT
- 22. Le bytecode Java est-il compatible avec différentes mises à jour de la même version de Java?
- 23. Réduire au minimum les informations dans un segment de signature à l'aide RSACryptoServiceProvider
- 24. Lire les informations de garmin
- 25. Signature d'une méthode Java avec des paramètres annotés avec JDT
- 26. Outil de génération Java/Flex ORM/DTO
- 27. Java Génériques et nombres
- 28. lecture bytecode d'une AnnotationProcessor
- 29. Java Génériques et réflexion!
- 30. Génération de liaisons SWIG avec CMake
Eh bien, je cherchais un moyen d'obtenir directement de la réflexion api sans ré-analyser le fichier de classe en utilisant asm . La chose devient difficile avec la réflexion api pour génériques –
OK, je pense que je comprends - je ne suis pas sûr qu'il y aurait une approche unique pour tous. Si une méthode renvoie une valeur, vous devez y ajouter une certaine logique pour la rendre valide (en supposant qu'elle ne soit pas abstraite). – McDowell