Temporäres Support-Memo, wenn der Name des Methodenparameters der Java-Klasse nicht durch Reflektion im Eclipse-Plug-In-Projekt abgerufen werden kann

Seit Java8 ist es möglich, den Parameternamen der Methode einschließlich des Konstruktors der Klasse durch Reflektion abzurufen. Durch Kompilieren mit der zu javac hinzugefügten Option -parameters werden die dafür erforderlichen Informationen in der Klassendatei gespeichert.

In Eclipse können Sie beispielsweise im Fall eines Java-Projekts ein entsprechendes JAR erstellen, indem Sie in den Einstellungen, die allen Projekten oder für jedes Projekt gemeinsam sind, Folgendes überprüfen und exportieren. Möglicherweise wird durch Aktivieren die Option -parameters intern festgelegt und kompiliert. eclipse-setting.png Es ist einfach, aber Sie können den Parameternamen überprüfen, indem Sie die Referenz aus dem Verweis auf den Konstruktor oder das Methodenobjekt wie folgt verwenden.

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());
    }
}

Symptome des Problems

Im Fall eines Plug-In-Projekts scheint diese Einstellung jedoch aus irgendeinem Grund nicht zu funktionieren, und im exportierten "jar" (oder Bundle) lauten die Methodenparameternamen "arg0, arg1, arg2 ..." Es wird sein. Solche Namen werden automatisch vergeben, wenn Sie die Option "-parameters" nicht angeben. Die von Ihnen verwendete Eclipse-IDE lautet "Version: 2020-06 (4.16.0) Build-ID: 20200615-1200". (Vielleicht die neueste)

Im Falle eines Plug-In-Projekts sieht es daher so aus, als ob es tatsächlich kompiliert wird, ohne die Option "-paramters" zu verwenden, selbst wenn Sie es überprüfen. Wenn Sie dies aktivieren, wird die folgende Zeile zur folgenden Datei hinzugefügt.

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

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

Beim Exportieren in ein Projekt mit dieser Einstellung wird erwartet, dass ein "jar" erstellt wird, in dem der Parametername der Methode durch Reflektion erhalten werden kann.

Im Fall eines Plug-In-Projekts ist es nützlich, eine "MANIFEST.MF" zu erstellen, die die Abhängigkeit des Bundles deutlich zeigt, und auf einfache Weise ein OSGi-Bundle zu erstellen. Dieser Fall war jedoch recht unpraktisch.

vorübergehende Lösung

Lesen Sie daher nach dem Erstellen eines Java-Projekts mit derselben Quelle wie das Plug-In-Projekt die Vorlage von "MANIFEST.MF", mit der die im Plug-In-Projekt erstellte Bundle-Abhängigkeit behoben wurde. Ich habe beschlossen, ein OSGi-Bundle zu erstellen. (Es ist einfach)

Dies ist ein Memorandum. (Vielleicht stimmt etwas nicht?)

Recommended Posts

Temporäres Support-Memo, wenn der Name des Methodenparameters der Java-Klasse nicht durch Reflektion im Eclipse-Plug-In-Projekt abgerufen werden kann
Benennen und rufen Sie in Ruby übergeordnete Klassenmethoden explizit auf
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
Ein Teil der Klasse, der von der zu testenden Klasse im JMockit Mock-Methodenmemo aufgerufen wurde
Ruft den Klassennamen und den Methodennamen des Controllers ab, der vom HandlerInterceptor von Spring Boot ausgeführt wird
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
[Java] Behandlung von Java Beans in der Methodenkette
[Java] Dynamischer Methodenaufruf durch Reflektion des Aufzählungstyps (Aufzählung)
Wenn Sie sich im Klassennamen verlieren
Methodenname der Methodenkette in Java Builder + α
Wenn das Projekt nicht in Eclipse angezeigt wird
[Rails] Das Textlicht von Bootstrap kann nicht von der link_to-Methode geerbt werden, da die Klasse nicht als Argument in der Methode geschrieben ist.
[Java] Ganzzahlige Informationen von Zeichen in der Textdatei, die mit der Methode read () erfasst wurden
[Kotlin] Ermittelt den Argumentnamen des Konstruktors durch Reflektion
Lesen Sie die Paketerfassung, die von tcpdump mit Java erhalten wurde
Rufen Sie den Namen des Testfalls in der JUnit-Testklasse ab
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
[Java] Es scheint, dass Sie nicht "0 <hoge <10" in den bedingten Ausdruck der "if" -Anweisung schreiben können.
Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
Zusammenfassung der von der Spliterator-Merkmalsmethode #java zurückgegebenen Werte
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
Speicherort der Methodendefinition Zusammenfassung der zu überprüfenden Informationen Wenn im Projekt und in Rails / Gem definiert