2009-06-12 2 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으로 설정할 수 있습니다. java.lang.reflect.Method에서 get the class을 사용할 수 있으므로 ClassVisitor s/MethodVisitor에서 inspect the methods까지 사용할 수 있습니다.

+0

이 잘 나는 ASM을 사용하여 클래스 파일을 파싱하지 않고 반사 API를 직접 얻을 수있는 방법을 찾고 있었다() 예를 들어 Type.getType (String.class)를 스프링 ASM을 라이브러리를 사용하는 . 그 물건은 Reflection API로 Generics에 대해 까다로워진다. –

+0

OK, 나는 이해할 수 있다고 생각한다. - 이것에 대한 one-size-fits-all 접근법이 있을지 확신하지 못한다. 메소드가 값을 리턴하면, 유효하지 않게하려면 일부 논리를 넣어 야합니다 (추상이 아닌 것으로 가정). – 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;>; 

(제네릭 추가시)

그래서 제네릭 이외의 설명을 보완하기 위해 제네릭 서명을 생성하는 것이 합리적으로 간단해야합니다. 그것은 제네릭 정보가 소스에 추가되는 방법과 매우 흡사합니다. 단 한 문자 프리미티브 유형의 처리로 인한 기이함을 제외하고는.

아직 시도하지는 않았지만 ClassWriter의 visitMethod()도 서명이 필요하다는 점을 고려할 때 작동 할 것으로 기대됩니다. :)

+0

이게 겉으로보기에는 좋겠지 만, 그럴 가치가있는 것은 아닙니다. 문제는 ASM 자체가 그것을 추가하고 그것을 볼 수 있지만 JVM의 반사 방법은 어떤 이유로 그것을 찾지 않는 것 같습니다. : - / – StaxMan

0

봅니다