2009-06-12 14 views

答えて

4

。おそらく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.Methodorg.objectweb.asm.commons.Methodにすることもできます。 get the classはjava.lang.reflect.Methodですので、ClassVisitor s/MethodVisitorからinspect the methodsを使用できます。

+0

(例えばType.getType(String.class))春-ASMライブラリを使用してみてください。ジェネリック向けのリフレクションAPIで問題になるのはわかりました –

+0

OK、私は理解していると思います - それにワンサイズのアプローチがあるとは思いません。メソッドが値を返す場合、それを有効にするためにロジックに値を入れる必要があります(抽象ではないと仮定します)。 – McDowell

1

私は非常に似たようなことをしようとしていたと思います(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()も署名を取得しているので、動作することを期待しています。 :)

+0

これは価値がありますが、これは一見したところではうまくいくはずですが、そうではないようです。問題は、ASM自体がそれを追加して見ることができますが、JVMのリフレクション・メソッドは何らかの理由でそれを見つけられないようです。 : - / – StaxMan

0

はまあ、私は、ASMを使用してクラスファイルを再解析することなく、リフレクションAPIから直接取得する方法を探していた

関連する問題