java.lang.reflect.Method에서 메소드 서명을 생성하는 바이트 코드를 작성하려고합니다. 시그니처 (generic 형식) 부분은 형식 정보를 가져 와서 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으로 설정할 수 있습니다. java.lang.reflect.Method에서 get the class을 사용할 수 있으므로 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;>;
(제네릭 추가시)
그래서 제네릭 이외의 설명을 보완하기 위해 제네릭 서명을 생성하는 것이 합리적으로 간단해야합니다. 그것은 제네릭 정보가 소스에 추가되는 방법과 매우 흡사합니다. 단 한 문자 프리미티브 유형의 처리로 인한 기이함을 제외하고는.
아직 시도하지는 않았지만 ClassWriter의 visitMethod()도 서명이 필요하다는 점을 고려할 때 작동 할 것으로 기대됩니다. :)
이게 겉으로보기에는 좋겠지 만, 그럴 가치가있는 것은 아닙니다. 문제는 ASM 자체가 그것을 추가하고 그것을 볼 수 있지만 JVM의 반사 방법은 어떤 이유로 그것을 찾지 않는 것 같습니다. : - / – StaxMan
봅니다
- 1. Java 바이트 코드 컴파일
- 2. Java 바이트 코드 이해
- 3. Eclipse의 CompilationUnit에서 바이트 코드 생성
- 4. Java 프로그램을 사용하는 소스 코드 (COBOL) 생성
- 5. Java - 일반을 사용하는 다중 서명?
- 6. 컴파일러 최적화 : Java 바이트 코드
- 7. 바이트 코드에서 Java 소스 코드
- 8. Java : 0x7F보다 큰 바이트 리터럴을 사용하는 방법
- 9. 일반 메서드 서명
- 10. ilasm/ildasm 용 Java 바이트 코드
- 11. 안드로이드 패키지를 일반 Java 코드
- 12. PKCS # 7 사양을 사용하는 서명 생성
- 13. Java 코드 서명 인증서가 SSL 인증서와 동일합니까?
- 14. 대리인 서명/일반 대리인?
- 15. 일반 람다 메서드 서명
- 16. J2ME - verisign을 사용하는 코드 서명 중급 CA
- 17. Java 바이트 코드 ASM을 사용한 조작
- 18. Java 바이트 코드 컴파일러 벤치 마크
- 19. 디 컴파일 후 Java 파일에 바이트 코드
- 20. Java 바이트 코드 (jar)로 문자열 수정
- 21. JavaScript 코드 서명
- 22. 코드 생성 - XML to Java
- 23. Java : 기존 테이블에서 CREATE TABLE 코드 생성
- 24. 동적 바이트 코드 실행
- 25. 코드 서명 "응용 프로그램이 코드 서명 확인에 실패했습니다 ...."
- 26. Java 소스 코드 생성 및 점프
- 27. 자바 바이트 코드 비주얼 라이저
- 28. 디지털 서명 생성
- 29. Java JIT 컴파일 원시 바이트 코드 디 컴파일
- 30. 코드 서명 오류 디버깅
이 잘 나는 ASM을 사용하여 클래스 파일을 파싱하지 않고 반사 API를 직접 얻을 수있는 방법을 찾고 있었다() 예를 들어 Type.getType (String.class)를 스프링 ASM을 라이브러리를 사용하는 . 그 물건은 Reflection API로 Generics에 대해 까다로워진다. –
OK, 나는 이해할 수 있다고 생각한다. - 이것에 대한 one-size-fits-all 접근법이 있을지 확신하지 못한다. 메소드가 값을 리턴하면, 유효하지 않게하려면 일부 논리를 넣어 야합니다 (추상이 아닌 것으로 가정). – McDowell