Java에서 RFC 계산을 수행하는 알고리즘


2

Java 클래스의 RFC는 클래스의 객체에 대한 메시지 또는 클래스의 일부 메소드에 대한 메시지에 대한 응답으로 호출 할 수있는 모든 메소드로 설정됩니다. RFC = M + R 여기서 M = 클래스의 메소드 수. R = M에서 직접 호출 한 다른 메소드의 총 수.

생각하는 C는 .class이고 J는 RFC를 계산해야하는 .java 파일입니다. 여기

 
class J{ 

a(){} 
b(){} 
c(){ 
    e1.e(); 
    e1.f(); 
    e1.g(); 
} 
h(){ 
    i.k(); 
    i.j(); 
    } 
    m(){} 
    n(){ 
    i.o(); 
    i.p(); 
    i.p(); 
    i.p(); 
    } 
} 

M = 6 및 R = 9 (루프 내부 호출에 대해 걱정하지 마십시오. 그것은 하나의 통화로 간주)

계산 M은 간단합니다. 클래스 로더를 사용하여 C를로드하고 리플렉션을 사용하여 메소드 수를 가져옵니다.

계산식 R은 직접적인 것이 아닙니다. 클래스의 메서드 호출 수를 계산해야합니다. 1 단계 만.

R 계산시 정규 표현식을 사용해야합니다. 전화 수익은 바로 다른 방법에 매개 변수가 될 때 일반적으로 형식은 밖으로 세미콜론

 
[variable_name].[method_name]([zero or more parameters]); 

또는

 
[variable_name].[method_name]([zero or more parameters]) 

을 (. 사용하지 않고 통화 계산되지 않습니다) 일 것이다. 또는

 
[variable_name].[method_name]([zero or more parameters]).method2(); 

이 두 가지 방법은 당신이 생각할 수있는 메서드 호출의 어떤 다른 패턴

를 호출된다? R.

을 계산하는 데 사용할 수있는 정규식을 사용하는 것보다 다른 어떤 다른 방법이 있나요

UPDATE :
@McDowell 내가 전체 프로세스를 단순화 할 수 BCEL를 사용하는 것 같은데. 내가 그것을 시도하자.

2

Byte Code Engineering Library을 바이너리와 함께 사용할 수 있습니다. DescendingVisitor을 사용하여 수업의 회원 및 참조를 방문 할 수 있습니다. 나는 이것을 find class dependencies에 사용했습니다.

또는 원본 파일의 일부 모델을 다시 사용할 수 있습니다. Eclipse JDT의 Java 편집기가 어떤 형태의 모델에 의해 뒷받침되는 것은 확실합니다.


0

Java language specification에 답을 찾아야합니다.

당신은 정적 메소드 호출, 매개 변수를 내부 메서드 호출을 잊은

...


0

방법을 사용하여 반사 호출 (메소드의 이름은 문자열입니다).


0

M은 자체 메소드 호출을 포함합니까? 또는 내부 클래스에 대한 호출? 예 :

class J { 
    a() { } 
    b() { this.a(); } 
    c() { jj.aa(); } 
    d() { i.k(); } 
    e() { this.f().a(); } 
    f() { return this; } 
    g() { i.m().n(); } 

    class JJ { 
    aa() { a(); } 
    } 
} 

이 M 값은 무엇입니까? 이 클래스에서 정의되지 않은 메소드 (d() 및 g() 함수의 호출)에는 세 가지 함수 호출 만 있습니다.내부 클래스에 대한 호출 또는 내부 클래스에서 만들어진 기본 클래스에 대한 호출을 포함 하시겠습니까? 다른 클래스에 대한 호출을 같은 클래스에 포함 시키시겠습니까?

원본과 관계없이 모든 메서드 호출을 살펴보면 정규식이 작동하지만 옳은 것은 당연합니다 (정규 표현식은 내용과 같이 메서드 호출을 포함하는 문자열을 제대로 무시합니까? 생성자 호출을 제대로 처리합니까?). 당신이 메서드 호출의 소스에 관심이 있다면 정규식은 아마도 당신이 원하는 것을 얻지 못할 것이다. 리플렉션을 사용해야합니다 (불행히도 리플렉션에 대해 충분히 알지 못해도 도움이 될 것입니다).