2008-10-02 9 views
12

저는 Java 서비스와 다른 여러 언어로 작성된 클라이언트간에 많은 원격 객체 전송을 수행하는 프로젝트에서 작업하고 있습니다. 현재의 제약 조건을 감안할 때 기존 Java 클래스를 기반으로 코드를 생성하는 데 필요한 것이 무엇인지 알아보기로 결정했습니다. 기본적으로 나는 .class 파일 (또는 그것들의 콜렉션)을 가지고 바이트 코드를 분석하여 모든 데이터 멤버와 getters/setter를 결정한 다음 다른 언어로 코드를 출력하여 동일한 구조의 클래스를 만들 수있는 무언가를 작성합니다 ..class 파일을 프로그램 방식으로 검사하십시오.

JAD와 같은 표준 디 컴파일러를 찾고 있지 않습니다. .class 파일을 가져 와서 해당 데이터 멤버 및 메서드의 개체 모델을 만들 수 있어야합니다. 이것이 가능합니까?

답변

12

BCEL을 사용하여 매우 어색함을 느낍니다. ASM이 훨씬 좋습니다. 아주 광범위하게 방문자를 사용하며 (약간 혼란 스러울 수 있음) 객체 모델을 만들지 않습니다. 생성하려는 모델이 모든 데이터를 문자 그대로 해석하는 것처럼 보이지 않으므로 개체 모델을 만들지 않으면 보너스가됩니다.

+2

+1 for ASM for BCEL. 훨씬 좋은 API. – skaffman

+1

사실, ASM은 원한다면 객체 모델을 제공합니다. Tree API를 참조하십시오. –

+0

여기까지 나열된 모든 옵션을 평가 한 후 ASM은 .class 파일을 검사하는 데있어 가장 좋은 IMH입니다. 방문자 패턴이 BCEL 모델보다 훨씬 깨끗하다는 데 동의합니다. 팁 고마워. –

1

나는 과거에 BCEL을 사용 했으므로 꽤 사용하기 쉽습니다. 몇 년 전 이었으므로 이제는 더 나은 것이있을 수 있습니다.

Apache Jakarta BCEL

+0

와우, 당신은 실제로 내 자신의 질문에 대답하기 위해 나를 때렸다. 그것이 내 기본 선택이었습니다. 저는 질문을하고 직접 대답하고 다른 누군가가 더 좋은 아이디어를 갖고 있는지 보려고했습니다. 감사. –

0

나는와 Javassist가 당신도 도움이 될 것 같아요.

http://www.jboss.org/javassist/

나는 그것을 사용의 필요성을 가진 적이 있지만 그것을 시도 줄 경우, 당신은 우리가 그것에 대해 의견을 알려 것입니다?

바이트 검사보다는 .class 검사가 더 좋다고 생각합니다.

1

설명에 따르면 simple reflection이면 충분합니다. 특정 인스턴스의 필드에 액세스 할뿐만 아니라 클래스의 모든 정적 구조를 검색 할 수 있습니다.

메소드 지침을 번역하려는 경우 BCEL로 이동합니다. (그리고 자동화하려는 경우 행운을 빈다.)

+0

반사 가능한 솔루션 동안, 이상적이지 않습니다. 임의의 .class 파일을 가리키고 해체 할 수 있기를 원합니다. 리플렉션을 사용한다면 클래스 로더를 사용하기 전에 클래스 로더를로드해야합니다. –

1

JAD은 프로그래밍 방식 액세스를 허용하지 않는 java 디 컴파일러입니다. 더 이상 쉽게 사용할 수 없으며 Java7 바이트 코드가있는 새로운 프로젝트에서는 작동하지 않을 것입니다.

+0

JAD는 디 컴파일러이므로 프로그래밍 방식으로 작동하는 것이 필요합니다. –

+0

참고로이 링크는 죽었습니다 ... – hichris123

+0

이 링크를 고정하고 텍스트를 추가했습니다. –

1

아직 아무도 ASM을 언급하지 않았다는 점에 놀랐습니다. 돈이 살 수있는 최고의 바이트 코드 라이브러리입니다. 글쎄, 괜찮아.