2009-07-25 11 views
1

Java 소스 파일에서 일부 결합 메트릭을 측정하는 도구를 만들었지 만 이러한 메트릭은 메소드에서 액세스하는 속성 목록을 결정할 수 있는지 여부에 달려 있습니다. 메소드 코드를 추출했지만 몇 가지 문제점이있어서 Java 파일을 구문 분석하고 메소드 코드를 텍스트로 추출 할 수있는 도구가 있는지 물어 본다.Java 메소드 텍스트 추출

감사합니다,

+0

당신이 가진 것과 당신이하고 싶은 것을 정확히 보여주는 코드 샘플을 제공해 줄 수 있습니까? –

+0

액세스되는 속성이 정확히 무엇입니까? 들판을 의미합니까? –

답변

0

자바 클래스를 컴파일하기위한 꽤 오래된 도구 jad입니다. 그것은 jdk 1.5까지 잘 작동합니다.

+0

답변을 많이 주셔서 감사합니다. 하지만 de-compiler는 필요하지 않습니다. 사실 클래스의 각 Method 객체를 메서드 텍스트가 포함 된 문자열에 연결하려고합니다. 예를 들어이 클래스가있는 경우 : ClassA { void m1 {int x;}} 그런 다음 메서드 코드를 나타내는 text = {int x;}}를 포함하도록 리플렉션에서 생성 된 메서드 m1의 래퍼와 비슷한 것을 만들 수있는 Java 라이브러리가 필요합니다. com.sun.org.apache.bcel을 사용하려고했지만 com.sun.org.apache.bcel.internal.classfile 클래스의 사용 가능한 메서드를 사용하여 메서드 코드를 추출 할 수 없습니다. 방법 감사합니다. –

+0

ClassA의 래퍼는 ClassA의 각 메소드의 소스 코드를 알 수 있습니까? – Burkhard

+0

예, 정확하게. 일반 반사 프레임 워크에서 Method 클래스에는 메서드 시그니처를 알 수있는 메서드와 메서드가 있지만 메서드 코드를 검색 할 메서드는 없습니다. 그래서 각 메서드 개체에 대해 리플렉션 프레임 워크에 대한 래퍼 인 수동 코드를 작성했습니다. 메서드 코드를 작성했지만 코드에 몇 가지 문제가있어서 기존 테스트 도구를 찾았습니다. –

0

실제로 클래스 파일에서 작업하는 것이 더 쉽지만 (더 많은 도구가 있음), 일부 Java 소스 파서도있는 것처럼 보입니다. "javaparser"는 멋지게 보입니다 : http://code.google.com/p/javaparser/

+0

답장을 보내 주셔서 감사합니다. 내 주요 문제는 m 메서드가있는 경우이 메서드에서 액세스 한 특성 목록과 메서드 m에서 호출하는 다른 메서드 목록을 얻고 싶습니다. 그래서 나는 생각했습니다. 코드 파일을 파싱하는 것이 좋은 방법이지만, 훨씬 쉬운 방법을 알고 있다면 그것에 대해 말해주는 것이 도움이 될 것입니다. 또한 일반적인 리플렉션 프레임 워크 나 com.sun.org.apache.bcel 프레임 워크에서 가능합니다. ? 고마워요, –

+0

아직까지 이와 같은 작업을 수행하지 않았습니다. 리플렉션은 문제의 클래스를로드 할 수 있어야하기 때문에 접근 방법이 아니므로 메소드 내부에서 인트로 스코프 할 수는 없습니다. . 또한 대답 한 Martin v. Lwwis는 BCEL에 대한 경험이있는 것 같습니다. –

1

나는 당신이 원하는 것이 무엇인지 회의적입니다. 소스 코드가 있다고 가정하면 액세스되는 속성 목록을 어떻게 결정할 수 있습니까?

대신, 바이트 코드를 걸고 getfield 및 setfield opcode를 찾아야합니다. BCEL은이를 수행하기위한 적절한 접근법입니다.

0

사용 ASM은 당신이 원하는 무엇이든을위한 클래스를 "분석"아주 쉽게. 귀하의 문제를 해결하기 위해 그것을 올바르게 이해하면 기본적으로 방문자를 작성하고 상기 방법 내에서 필드를 조심하십시오.

0

메소드 본문의 자세한 내용을 보려면 Java 파서가 필요합니다. Java 코드의 각 기호가 나타내는 것을 알기 위해서는 각 메소드/클래스/패키지의 기호 테이블에 해당하는 것을 작성할 수있는 무언가가 필요합니다.

Java Front End은 Java 소스 파일 세트 (사용할 수없는 소스의 클래스 파일 사용)에 대한 기호 테이블을 작성하는 완전한 기능을 갖춘 Java 파서입니다. Java 프론트 엔드는 AST를 빌드하고 메소드에 대해 AST를 하위 트리로 분할하는 데 사용할 수 있으며 사전 테스터 (prettyprinter)는 각 메소드 (주석 포함)의 텍스트를 다시 생성 할 수 있습니다. 이것은 모두 프로그램 변환 시스템 인 DMS 위에 구축되었습니다.