java.lang.reflect.Methodからメソッドシグネチャを生成するためにバイトコードを生成しようとしています。型情報を取得してそれをasmのニーズに変換するためのリフレクションAPIとしての署名(ジェネリック型)の部分は難解です。すでにこれを行うコードを知っていますか?reflect.Methodから汎用署名情報を使用したJavaバイトコード生成
答えて
ように私は、既存のライブラリを使用することをお勧めしたい:私はこれを自動的に行いますツールを認識していないです
。おそらくorg.objectweb.asm.util.ASMifierClassVisitorクラスを使用して、シグネチャとASM API呼び出しの関係を把握することになります。このコードを含むクラスについては
:
public void foo1(Object o1, String s2) {
}
...ツールが生成されます。このコードの場合
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();
を:
public static final String[] foo2() {
return null;
}
...それが生成されます。 :
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();
method signatures in the FAQに関する注釈があり、それが理解できる場合はJava class nomenclatureとなります。
ASM APIを使用して、java.lang.reflect.Methodをorg.objectweb.asm.commons.Methodにすることもできます。 のget the classはjava.lang.reflect.Methodですので、ClassVisitor s/MethodVisitorからinspect the methodsを使用できます。
私は非常に似たようなことをしようとしていたと思います(Generating methods with generic types with Asm bytecode generator (ClassWriter))。
クラス訪問者のvisitMethodから、私のような、そのメソッドを参照することができます
public List<String> foobar(List<Integer> args, List<Boolean> args2);
は次のように説明を生成します:
(Ljava/util/List;Ljava/util/List;)Ljava/util/List;
(ジェネリック医薬品情報なしで、予想通り)
や署名などの:
(Ljava/util/List<Ljava/lang/Integer;>;Ljava/util/List<Ljava/lang/Boolean;>;)Ljava/util/List<Ljava/lang/String;>;
(ジェネリックが追加されています)
したがって、ジェネリックな署名を生成して非ジェネリックな記述を増やすことはかなり簡単です。これは、1文字のプリミティブ型を扱うことによって導入された奇妙な点を除いて、ソースにジェネリックス情報がどのように追加されるかと非常に似ています。
まだ試したことはありませんが、ClassWriterのvisitMethod()も署名を取得しているので、動作することを期待しています。 :)
これは価値がありますが、これは一見したところではうまくいくはずですが、そうではないようです。問題は、ASM自体がそれを追加して見ることができますが、JVMのリフレクション・メソッドは何らかの理由でそれを見つけられないようです。 : - / – StaxMan
はまあ、私は、ASMを使用してクラスファイルを再解析することなく、リフレクションAPIから直接取得する方法を探していた
- 1. SHA1withRSAを使用したJavaデジタル署名
- 2. Javaを使用したスタックオーバーフローAPIからの情報の取得
- 3. AES256署名資格情報でjwtを使用する
- 4. アプレットの署名情報
- 5. PHPを使用した統計情報(ページビュー、ユニークビジター)の生成?
- 6. Javaで汎用コードを生成
- 7. 別のリストからの情報を使用して数値のリストを生成
- 8. ウェブサイトからデータベースを使用して署名付きAPKを生成
- 9. Javaを使用した大規模なXML生成と報告
- 10. C#WMIサービス情報のクエリで汎用エラーが発生する
- 11. jks React Nativeを使用して署名付きAPKを生成
- 12. キーストアを使用して署名付きAPKを生成
- 13. 署名者情報は、同じパッケージに他のクラスの署名者情報と一致しない
- 14. JFaceの署名者情報が、同じパッケージ内の他のクラスの署名者情報と一致しない
- 15. Javaバイトコードにコンパイル(Javaを使用せず)
- 16. org.simalliance.openmobileapi.jarファイルを使用したプロジェクトで署名付きapkファイルを生成
- 17. Javaを使用したSQLからLiquibaseの変更を生成
- 18. Java EE/JPAを使用したデータベースメタ情報の取得
- 19. 自己署名証明書を使用したJava SSLHandshakeException
- 20. DIIOP経由のJava APIを使用したLotus Notesメール署名
- 21. デジタル署名を使用したJava RESTサービス
- 22. リクエストからの情報を使用したAddTransientサービス
- 23. JavaでPKCS#7の署名を確認するための情報
- 24. iOS Security.frameworkを使用した自己署名証明書の生成?
- 25. CSSを使用した情報ボックス - ブートストラップ
- 26. DNSPythonを使用したDNSSEC署名RRSET
- 27. プレーンJavaScriptを使用したPDF署名
- 28. openSAMLを使用した署名応答
- 29. iTextを使用して署名すると、Adobe Readerは「署名は使用不可で作成されました」と報告します。
- 30. jvmバイトコードからjavaクラスファイルヘッダを生成する
(例えばType.getType(String.class))春-ASMライブラリを使用してみてください。ジェネリック向けのリフレクションAPIで問題になるのはわかりました –
OK、私は理解していると思います - それにワンサイズのアプローチがあるとは思いません。メソッドが値を返す場合、それを有効にするためにロジックに値を入れる必要があります(抽象ではないと仮定します)。 – McDowell