Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 14

Как в методе получить значения атрибутов класса, если я передаю на вход этого метода интерфейс, а не класс?

06.01.2021, 23:20. Показов 2871. Ответов 4
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такая задача : "Создайте класс JsonCollector, с методом void getInfo(JSONImportable ji), который принимает на вход объекты и записывает в файл их представление в виде JSON". Сразу отмечу, что JSONImportable - это по условию задачи интерфейс, т.е. данный метод принимает на вход только те объекты, которые этот интерфейс имплементируют, к тому же, нельзя создать объект интерфейса, также как и нельзя создать объект абстрактного класса.

Чтобы представить объект в виде JSON-строки, нужно получить его атрибуты, а именно их названия и значения. Проблема такая: с получением названий атрибутов переданного на вход объекта проблем не возникло, но со значениями этих атрибутов неувязочка: чтобы использовать метод java.lang.reflect.Field.get(Object o), нужно создать конкретный объект передаваемого класса и передать его в качестве параметра в метод get(), как в этом примере:
Java
1
2
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
Но мы ведь не можем как в примере выше создать объект интерфейса.
Чтобы было понятнее, вот код:

Ниже собственно сам JsonCollector.

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
 
package com.company;
import java.io.File;
import java.io.IOException;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.util.ArrayList;
 
 
public class JsonCollector {
 
    // Здесь мы передаем на вход интерфейc JSONImportable
    public void getInfo(JSONImportable ji) {
 
        Class aClass = ji.getClass(); 
        Field[] fields = aClass.getFields(); // получаю сами атрибуты в виде массива fields
        ArrayList<String> fieldNames = new ArrayList<String>(); //сюда буду сохранять названия атрибутов переданного объекта, люблю ArrayList'ы
        int i = fields.length;
 
        Object[] values = new Object[i]; // сюда сохраню значения атрибутов
        Object[] result = new Object[i * 2]; // итоговый массив, который будет состоять из чередований имён атрибутов и их значений
 
        // Получение названий атрибутов
        for (int j = 0; j < i; j++) {
// метод getName() не требует создания конкретного объекта и прямо берет названия атрибутов из fields
            fieldNames.add(fields[j].getName()); 
        }
 
        // Получение значений атрибутов 
// Беру значения из массива fields типа Field и записываю их в массив values типа Object, поскольку значения могут быть разных типов
        for (int j = 0; j < i; j++) {
// ВОТ ЗДЕСЬ ПРОБЛЕМА, КАК ПОЛУЧИТЬ ЗНАЧЕНИЯ АТРИБУТОВ, ЧТО ПЕРЕДАТЬ В МЕТОД get()???
// метод get() требует на вход конкретный объект, но я же не могу создать конкретный объект интерфейса JSONImportable
            values[j] = fields[j].get(); 
        }
 
// далее внимания не обращаем, это еще не доработано
 
        // String jsonStr = "{ \"title\":" + "\"" + name + "\"" +"," + "\"description\":" + "age" + " }";  
// запись объекта в файл в виде JSON-строки
        String name = ji.getClass().getSimpleName() + ".json";
        try {
            File myObj = new File(name);
            if (myObj.createNewFile()) {
                System.out.println("File created: " + myObj.getName());
            } else {
                System.out.println("File already exists.");
            }
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
 
        try {
            FileWriter myWriter = new FileWriter(name);
            myWriter.write("jsonStr");
            myWriter.close();
            System.out.println("Successfully wrote to the file.");
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
 
 
}
И вот, к примеру, простецкй класс Cat, который мы можем передать в метод getInfo() вышеописанного класса, поскольку он имплементирует интерфейс JSONImportable
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.company;
 
public class Cat implements JSONImportable {
 
 
 
    public String name;
    public int age;
 
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String getJson() {
        String jsonStr = "{ \"title\":" + "\"" + name + "\"" +"," + "\"description\":" + age + " }";
        return jsonStr;
    }
}
И еще раз повторю проблему: как получить значения атрибутов, если на вход метода не передается какой-то конкретный класс, а интерфейс, иными словами - определенная группа классов, имплементирующая этот интерфейс.
Спасибо всем за помощь!

p.s.: заранее прошу прощения, если неправильно называю те или иные вещи из Java или ООП, я пока еще профан в этом и не владею нужной терминологией в полной мере.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2021, 23:20
Ответы с готовыми решениями:

Вызов метода класса в лямбде-функции, вызываемой в другом методе этого же класса
Здравствуйте. Помогите грамотно передать в лямбду метод класса. Упрощенно. Есть класс. В одном методе этого класса вызывается...

Указатель метода класса в другом методе этого класса
Здравствуйте. Как можно передать в методе класса указатель на другой метод этого же класса. Задача сделать вот что: class A { ...

Как получить доступ к переменной находящейся в одном методе из другого метода в пределах одного класса
Привет всем! Очередной вопрос новичка, допустим, у меня есть метод 1, в котором назначена переменная, и метод 2 в этом же классе,...

4
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
06.01.2021, 23:35
Цитата Сообщение от quantumleap Посмотреть сообщение
values[j] = fields[j].get();
Java
1
values[j] = fields[j].get(ji);
0
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 14
07.01.2021, 00:00  [ТС]
Цитата Сообщение от Arsegg Посмотреть сообщение
Java
1
values[j] = fields[j].get(ji);
Сначала я так и сделал и вроде это выглядит логично, но в этом случаеIDE подчеркивает метод get() в коде красным, и если навести курсор, то всплывает сообщение "Unhandled exception: java.lang.IllegalAccessException".
А если попробовать выполнить программу, то выводит: "java: unreported exception java.lang.IllegalAccessException; must be caught or declared to be thrown" с указанием номера строки, где содержится этот самый проблемный метод get().
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
07.01.2021, 00:05
Лучший ответ Сообщение было отмечено quantumleap как решение

Решение

Цитата Сообщение от quantumleap Посмотреть сообщение
must be caught or declared to be thrown
...
1
0 / 0 / 0
Регистрация: 05.04.2019
Сообщений: 14
07.01.2021, 00:15  [ТС]
Нашёл проблему и она не в интерфейсе, а в отсутствии обработки исключений. Собственно, IDE мне верно подсказывала, добавил обработку исключений:
Java
1
2
3
4
5
6
7
8
for (int j = 0; j < i; j++) {
            try {
                values[j] = fields[j].get(ji);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
 
            }
        }
Потом в качестве проверки вывел значения values. Все верно! В исключениях пока не очень разбираюсь и даже не подозревал, что в некоторых случаях это обязательно =(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2021, 00:15
Помогаю со студенческими работами здесь

Новое окно+виджет. Как получить доступ к переменной из другой функции (метода) этого же класса?
QMainWindow* secondWindow = new QMainWindow(this); secondWindow-&gt;setGeometry(0,0,1024,720); ...

Как вызвать метод класса в другом методе этого же класса?
&lt;? class load_files{ public function traverse_hierarchy($path) { // from...

Использование метода класса как функции в качестве типизированного аргумента в методе класса
Использование метода класса как функции в качестве типизированного аргумента в методе класса C++: как правильно использовать метод ...

Как получить значение из метода класса, если метод возвращает указатель?
Всем привет. Как получить значение из метода класса, если метод возвращает указатель? Вот тут я пилю типо класса аккаунтов, у меня не...

Можно ли получить текущий класс объекта в статическом методе родительского класса?
Здравствуйте, можно ли получить текущий класс объекта в статическом методе родительского класса?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru