2012-02-16 5 views
0

Я пытался и пытаюсь какое-то время с этим, и я просто не могу его решить.Java - Extract Interface to File

Я должен извлечь классы из Java-файлов и печати в форме UML-диаграммы, в IDE или записи на файл

например программа

public class Complex { 
    private int re; 
    private int im; 

    public Complex(int re, int im) { 
     this.re = re; 
     this.im = im; 
    } 

    public Complex add(Complex h) { 
     return new Complex(this.re + h.re, this.im + h.im); 
    } 

    public Complex sub(Complex h) { 
     return new Complex(this.re - h.re, this.im - h.im); 
    } 

    public Complex mul(Complex h) { 
     int a = re; 
     int b = im; 
     int c = h.re; 
     int d = h.im; 
     return new Complex(a * c - b * d, b * c + a * d); 
    } 

    public Complex div(Complex h) { 
     int a = re; 
     int b = im; 
     int c = h.re; 
     int d = h.im; 
     return new Complex((a * c + b * d)/(c * c + d * d), (b * c - a * d) 
       /(c * c + d * d)); 
    } 

    public String toString() { 
     if (im >= 0) { 
      return re + " + " + im + "i"; 
     } else 
      return re + " " + im + "i"; 
    } 
} 

должны генерировать что-то вроде :

a Complex 
b int re 
b int re 
a Complex(re:int, im:int) 
a add():Complex 
a sub():Complex 
a mul():Complex 
a div():Complex 
a toString():String 
a main() 

Я начал с снятия первой скобки из файла;

import java.io.*; 

public class ClassExtract { 

    public static void main(String[] args) { 

     ClassExtract obj = new ClassExtract(); 
     obj.removeBracket("Complexx.txt"); 
    } 

    public void removeBracket(String filnamn) { 

     try { 
      File f = new File(filnamn); 
      FileReader fr = new FileReader(f); 
      BufferedReader br = new BufferedReader(fr); 

      FileWriter fw = new FileWriter("noparanthesis_" + filnamn); 
      BufferedWriter bw = new BufferedWriter(fw); 

      String rad = br.readLine(); 
      while (rad != null) { 
       rad = rad.replaceAll("\\(", " "); 
       bw.write(rad); 
       bw.newLine(); 
       rad = br.readLine(); 
      } 

      bw.close(); 
      br.close(); 

     } catch (FileNotFoundException e) { 
      System.out.printf("The file " + filnamn + " was not found."); 
     } catch (IOException e) { 
      System.out.printf("Writing error."); 
     } 
    } 
} 

Я думал о различных способах решения этой проблемы. Так, что я думаю, что было бы проще всего было бы лишить все после того, как собрали голову public class Complex, что означало бы оставшуюся часть файла будет выглядеть примерно так:

public Complex int re, int im 
public Complex add Complex h 
public Complex sub Complex h 

и т.д., и сделать то же самое и прочитать индекс линий.

Я действительно чувствую себя очень потерянным, и мне трудно решить эту проблему, любая помощь будет действительно оценена.

+3

почему бы не использовать отражение? –

+0

Вам нужно разобрать java? или вы можете загрузить скомпилированный класс с загрузчиком классов и использовать отражение? – stew

+0

Да, я должен прочитать .java-файл и сделать .txt-файл с результатом или получить его прямо в моей консоли IDE. @Qwe Теперь я читаю о отражении, кажется, что это может быть удобно, так как оно получает классы или такие, но небольшой конкретный пример может помочь вам в том, как вы думаете, что я мог бы его реализовать. – Dannzor

ответ

1

Как говорится в комментарии Qwe, вам будет намного лучше смотреть на Java Reflection APIs.

Это позволяет вам изучить класс и перечислить его методы, суперклассы, интерфейсы и так далее.

Решая эту проблему с помощью анализа регулярных выражений/текста, вы в основном пытаетесь написать частичный парсер Java, который является абсолютно ненужным количеством боли!

+0

Не совсем уверен, что вы имеете в виду. Дело в том, что Java будет обрабатывать все текстовые данные и просто предоставлять высокоуровневые отношения классов и сигнатуры методов, которые вам нужны. Например, даже если .java странно отформатирован! – DNA

+0

Да, невзирая на этот комментарий, я ошибся. Класс aClass = MyObject.class Конструктор [] constructors = aClass.getConstructors(); Я немного смущен. – Dannzor

+0

Кто-нибудь? В настоящее время я экспериментирую с возможностями отражения с этого веб-сайта: http://java.sun.com/developer/technicalArticles/ALT/Reflection/ , но я просто не могу заставить параметры методов правильно и с правильным выходом. – Dannzor