Mémo de support temporaire lorsque le nom du paramètre de méthode de la classe Java ne peut pas être obtenu par réflexion dans le projet de plug-in Eclipse

Depuis Java8, il est possible d'obtenir le nom du paramètre de la méthode incluant le constructeur de la classe par réflexion. En compilant avec l'option -parameters ajoutée à javac, les informations requises pour cela seront stockées dans le fichier de classe.

Dans Eclipse, par exemple, dans le cas d'un projet Java, vous pouvez créer un jar correspondant en vérifiant et en exportant les éléments suivants dans les paramètres communs à tous les projets ou pour chaque projet. Peut-être en cochant, l'option -parameters est définie en interne et compilée. eclipse-setting.png C'est simple, mais vous pouvez vérifier le nom du paramètre en utilisant la réflexion de la référence vers le constructeur ou l'objet de méthode comme suit.

for (Constructor<?> constructor : clazz.getDeclaredConstructors()) {
    System.out.println("constructor: " + constructor.getName());
    for (Parameter param : constructor.getParameters()) {
        System.out.println("  param: " + param.getName() + ", type: " + param.getType().getSimpleName());
    }
}
for (Method method : clazz.getDeclaredMethods()) {
    System.out.println("method: " + method.getName());
    for (Parameter param : method.getParameters()) {
        System.out.println("  param: " + param.getName() + ", type: " + param.getType().getSimpleName());
    }
}

Symptômes du problème

Cependant, dans le cas d'un projet de plug-in, pour une raison quelconque, ce paramètre ne semble pas fonctionner, et dans le jar (ou bundle) exporté, les noms des paramètres de méthode sont ʻarg0, arg1, arg2…Ce sera. Ces noms sont donnés automatiquement si vous ne spécifiez pas l'option-parameters. L'IDE Eclipse que vous utilisez est Version: 2020-06 (4.16.0) Build id: 20200615-1200`. (Peut-être le dernier)

À partir de là, il semble que le projet de plug-in soit en fait compilé sans l'option -paramters, même si elle est cochée. Si coché, la ligne suivante sera ajoutée au fichier suivant.

/.settings/org.eclipse.jdt.core.prefs

org.eclipse.jdt.core.compiler.codegen.methodParameters=generate

En exportant dans un projet avec ce paramètre, on s'attend à ce qu'un jar soit créé dans lequel le nom du paramètre de la méthode peut être obtenu par réflexion.

Dans le cas d'un projet de plug-in, il est utile de créer un MANIFEST.MF qui montre clairement la dépendance du bundle et de créer facilement un bundle OSGi, mais ce cas était assez gênant.

solution temporaire

Par conséquent, une fois créé un projet Java avec la même source que le projet de plug-in, reportez-vous au modèle de MANIFEST.MF qui a résolu la dépendance de bundle une fois créée dans le projet de plug-in. J'ai décidé de créer un bundle OSGi. (C'est facile)

Ceci est un mémorandum. (Peut-être que quelque chose ne va pas?)

Recommended Posts

Mémo de support temporaire lorsque le nom du paramètre de méthode de la classe Java ne peut pas être obtenu par réflexion dans le projet de plug-in Eclipse
Nommer et appeler explicitement des méthodes de classe parent dans Ruby
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Partie de la classe appelée à partir de la classe testée dans le mémo de méthode JMockit Mock
Obtenez le nom de classe et le nom de méthode du contrôleur exécuté par le HandlerInterceptor de Spring Boot
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
[Java] Gestion des Java Beans dans la chaîne de méthodes
[Java] Appel de méthode dynamique par réflexion du type enum (enum)
Quand tu te perds dans le nom de la classe
Nom de méthode de la chaîne de méthodes dans Java Builder + α
Lorsque le projet n'est pas affiché dans eclipse
[Rails] La lumière de texte de Bootstrap ne peut pas être héritée par la méthode link_to car la classe n'est pas écrite comme argument dans la méthode.
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
[Kotlin] Récupère le nom de l'argument du constructeur par réflexion
Lire la capture de paquets obtenue par tcpdump avec Java
Obtenez le nom du scénario de test dans la classe de test JUnit
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
[Java] Il semble que `0 <hoge <10` ne puisse pas être écrit dans l'expression conditionnelle de l'instruction ʻif`.
Lorsque vous utilisez le constructeur de la classe Date de Java, la date avance de 1900.
Éléments à prendre en compte lors de l'écriture de code en Java
Récapitulatif des valeurs renvoyées par la méthode des caractéristiques Spliterator #java
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
Emplacement de la définition de la méthode Résumé de la vérification Lorsque défini dans le projet et Rails / Gem