Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 15
1

Написать программу для автоматической генерации методов

12.12.2017, 19:41. Показов 789. Ответов 3
Метки нет (Все метки)

Дан текстовый файл, содержащий исходный код программы на языке Java. Написать
программу для автоматической генерации методов get, set, equals и hashcode для
заданного в командной строке класса или всех классов в входном файле. Вначале свой
работы программа должна осуществлять проверку существования этих методов, после чего,
в зависимости от настроек (которые указываются флагами командной строки),
либо заменяет существующие методы, либо нет.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package tester;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
 
 
/**
 * Created by shagi on 11.12.2014.
 */
public  class New {
    private static FileWriter fw;
 
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        System.out.println("Введите название файла:");
      //  String fileName = sc.nextLine();
        BufferedReader reader = new BufferedReader(new FileReader("q3.txt"));//fileName));
        System.out.print("Введите название класса:");
        String className="test";//sc.nextLine();
        ArrayList<String> text = new ArrayList<>();
 
        boolean isClassFound=false;
 
        while (reader.ready()) {
            String str=reader.readLine();
            if(str.contains("class "+className)){
                isClassFound=true;
            }
 
            if(isClassFound) {
 
                text.add(str);
            }
 
        }
        Map<String,String> fieldsMap;
        fieldsMap=findAllClassFields(text);
 
        reader.close();
        fw = new FileWriter("q1.txt");
    //    writeSetter(fieldsMap);
     //   writeGetter(fieldsMap);
        writeEquals(fieldsMap,className);
//        fw = new FileWriter(fileName);
//        for (String aText : text) {
//        }
        fw.close();
    }
 
 
 
    public static Map<String,String> findAllClassFields(ArrayList<String> text){
        Map<String,String> fieldsMap=new HashMap<>();
        boolean isClassEnded=false;
        int countOpen=0; //Количество  "{"
        int countClose=0;//Количество  "}"
        for (String str : text) {
            if (str.contains("{")) {
                countOpen++;
            } else if (str.contains("}")) {
                countClose++;
            }else if (countOpen-countClose==1 && isStringField(str)) {
                fieldsMap.put(getKeyAndValue(str,1),getKeyAndValue(str,0));
            }
 
 
            isClassEnded = countOpen==countClose;
            if (isClassEnded) return fieldsMap;
        }
        return null;
    }
 
    public static boolean isStringField(String str){
 
        //Если строка пустая - false
        if("".equals(str)) return false;
 
        //Если это комментарий - false
        char first=str.trim().charAt(0);
        if(first=='/' || first=='*'){
            return false;
        }
        return true;
    }
 
    public static String getKeyAndValue(String str,int a){
        String[] valueAndKey;
        if(str.contains("=")){
            String[] eq=str.split("=");
            valueAndKey=eq[0].split(" ");
        }else {
            valueAndKey=str.split(" ");
            int k=valueAndKey.length-1;
            String strqwe=valueAndKey[k];
            valueAndKey[k]=strqwe.substring(0,strqwe.length()-1);
        }
        if (a==1) return valueAndKey[valueAndKey.length-1];
        if (a==0) return valueAndKey[valueAndKey.length-2];
        return "";
    }
 
    public static void writeSetter(Map<String,String> fieldsMap)throws IOException{
        String out;
        for(Map.Entry<String,String> map:fieldsMap.entrySet()){
            out="\tpublic void "+"set"+map.getKey()+"("+map.getValue()+" "+map.getKey()+"){\n"+
            "\t\t"+"this."+map.getKey()+" = "+map.getKey()+";\n\t"+"}\n\n";
            fw.write(out);
        }
    }
 
    public static void writeGetter(Map<String,String> fieldsMap)throws IOException{
        String out;
        for(Map.Entry<String,String> map:fieldsMap.entrySet()){
            out="\tpublic "+map.getValue()+" get"+map.getKey()+"{\n"+
                    "\t\t"+"return "+map.getKey()+";\n\t"+"}\n\n";
            fw.write(out);
        }
    }
 
    public static void writeEquals(Map<String, String> fieldsMap, String className) throws IOException{
        fw.write("\t@Override\n"+
                  "\tpublic boolean equals(Object o) {\n"+
                  "\t\tif (this == o) return true;\n"+
                   "\t\tif (!(o instanceof "+className+")) return false;\n"+
                   "\n"+
                    "\t\t"+className+" "+className.toLowerCase()+" = ("+className+") o;\n"+
                    "\n");
        for(Map.Entry<String,String> map:fieldsMap.entrySet()){
            if(map.getValue().equals("int") || map.getValue().equals("byte") ||
                    map.getValue().equals("long") || map.getValue().equals("char")|| map.getValue().equals("boolean")){
                fw.write("\t\tif ("+map.getKey()+" != "+className+"."+map.getKey()+") return false;\n");
            }else if(map.getValue().equals("double")) {
                fw.write("\t\tif (Double.compare("+className+"."+map.getKey()+","+map.getKey()+") != 0) return false;\n");
            }else {
                fw.write("\t\tif (" + map.getKey() + " != null ? !" + map.getKey() + ".equals(" + className + "." + map.getKey() +
                        ") : " + className + "." + map.getKey() + " != null) return false;\n");
            }
        }
 
        fw.write("\t\treturn true;\n\t}");
    }
 
    public void writeHashCode(Map<String, String> fieldsMap) throws IOException{
        fw.write("\t@Override\n");
        fw.write("\tpublic int hashCode() {\n");
        fw.write("\t\t");
 
    }
 
    public static boolean ifTextContainsMethods(String str){
 
        return false;
    }
}
Добавлено через 20 секунд
вот мой вариант(еще не доделана), но мне почему-то кажется, что я пошел каким-то диким путем и есть ГОРАЗДО легче решение...

вкратце: находим все поля класса, и потом для каждого из них выводить геттеры сетеры equals.
а вот условие "Вначале свой работы программа должна осуществлять проверку существования этих методов" вообще
дикое. столько проверок делать надо

Добавлено через 26 секунд
Можете помочь доделать пожалуйста, очень надо!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2017, 19:41
Ответы с готовыми решениями:

Подскажите как написать программу, которая переименовать все названия методов во всех проектах автоматически
Входные данные: 1) набор .java файлов с проектами 2) JAR файл со злополучной библиотекой версией...

Метаданные для автоматической генерации базы данных
Необходимо создать пустую базу данных ,а затем &quot;вытащить&quot; метаданные для автоматической генерации...

Написать программу для автоматической смены разрешения экрана
Всем привет. У меня такая проблема, что сейчас у компа стоит вместо монитора телек, который можно...

Можно ли написать программу для автоматической смены пароля почты, скайпа
Ребята, нужен ваш совет, можно ли написать программу (теоретически) для автоматической смены...

3
Эксперт Java
3320 / 2406 / 432
Регистрация: 28.04.2012
Сообщений: 7,969
12.12.2017, 21:18 2
Цитата Сообщение от Dan98 Посмотреть сообщение
условие "Вначале свой работы программа должна осуществлять проверку существования этих методов" вообще дикое
Почему дикое?

Цитата Сообщение от Dan98 Посмотреть сообщение
столько проверок делать надо
Всего-то (количество полей)*2 + 2. Причём геттеры и сеттеры проверяются в цикле, так что фактически четыре проверки.

Конечно, если вместо того, чтобы сделать нормальные структуры данных, описывающие класс, фигачить всё в Map<String, String>, то будет сложно, да.
0
745 / 492 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
12.12.2017, 22:05 3
А если, допустим в классе есть анонимные классы или вложенные, их тоже форматить?
Или допустим к кажждому методу есть Javadoc, их оставлять?
0
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 15
15.12.2017, 20:38  [ТС] 4
Анонимные включаются в форматирование
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2017, 20:38

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Для автоматической генерации элементов коллекций в классе надо определить статический метод
Есть 2 класса Person (базовый класс) и Student (наследуемый класс). Для автоматической...

Написать консольную программу для генерации сигнатуры указанного файла (задействовать параллелизм)
Здравствуйте, дорогие форумчане. На днях подкинули заданице: Требуется написать консольную...

Написать программу для демонстрации всех методов класса
Описать класс по протоколу. Сохранить описание в отдельном модуле. Написать программу для...

ошибка в коде. Написать программу для выбора различных методов вычесления
Помогите ,пожалуйста, найти ошибку в коде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.