Как получить доступ ко всем полям данных класса?

#java #reflection

#java #отражение

Вопрос:

У меня есть несколько классов, таких как Client, Employee, Property, я поддерживаю список всех объектов в виде списков массивов в сетевой карте с именами классов. Итак, Java-код для сетевой карты класса похож:

     class NIC
{
  static ArrayList<Employee> employeeList = new ArrayList<Employee>();
  static ArrayList<Property> propertyList = new ArrayList<Property>();
  static ArrayList<Client> clientList = new ArrayList<Client>();

 //rest of the code
  public static void backItUp()
  {
    //this method reads all the objects data from array lists and stores it in a file
  }
}
  

Я застрял на методе BackItUp (), который должен считывать все данные объектов из списка массивов и сохранять их в файле.

Я не знаю, существует ли какой-либо метод, который может получить доступ ко всем полям данных текущего класса или, по крайней мере, возвращает ссылку на каждое поле данных.

Пожалуйста, помогите. Заранее спасибо.

Комментарии:

1. @user717417: В backItUp , почему вы не можете просто ссылаться на поля по их именам?

2. @user717417 Возможно, вы захотите указать, о каком языке здесь идет речь. По крайней мере, укажите язык в тегах. Вы можете отредактировать свой вопрос, чтобы добавить дополнительную информацию.

3. @aix: Я хочу обобщить код, чтобы мне не нужно было обновлять метод ‘BackItUp ()’ каждый раз, когда я обновляю поля сетевого адаптера класса или даже после изменения имени сетевого адаптера класса

4. Такого рода обобщение заходит слишком далеко. Хотя вы можете узнать содержимое класса с помощью reflectin, вы должны, по крайней мере, указать имя класса.

5. @lngo: Поскольку резервная копия метода находится в том же классе, поиск имени класса не будет сильно утомительным. Реальная проблема заключается в том, как получить доступ ко всем объектам, хранящимся в списках массивов.

Ответ №1:

Ваш лучший вариант — удалить static модификаторы из всех ваших полей и методов и создать NIC надлежащий объект, который может быть создан. Когда вы придерживаетесь ООП (объектно-ориентированных принципов), вы обнаружите, что все становится проще. После этого все, что вам нужно сделать, это сделать NIC implementate Serializable . Процедура сериализации по умолчанию автоматически сохранит в вашем классе все, что не помечено как transient . ArrayList s и все другие коллекции JDK уже сериализуемы, поэтому дальнейшей работы не требуется. Просто прочитайте руководство, опубликованное KDM.

Однако, если вы решите добавить больше полей или методов позже, вы все равно столкнетесь с проблемами совместимости, поскольку старые сохраняемые объекты больше не будут соответствовать сигнатуре нового, обновленного класса. Это соображение, которое должны учитывать все программисты. Использование serialVersionUID может немного помочь, например, в случаях, когда вы просто добавляете новые методы, но без новых полей, но для обеспечения обратной совместимости требуется надлежащее тестирование.

Ответ №2:

На мой взгляд, это хороший вариант для сериализации. Взгляните на http://java.sun.com/developer/technicalArticles/Programming/serialization или, может быть, немного поиска в Google действительно помогает.

Комментарии:

1. Как объясняется в ссылке, я могу создавать резервные копии объектов посредством сериализации, если я явно передам имя объекта. Но здесь меня больше интересует резервное копирование данных полей класса без необходимости ссылаться на какое-либо имя. Чтобы в будущем, если мне понадобится добавить или удалить списки массивов или изменить имя класса, мне не нужно было изменять код метода ‘BackItUp()’

2. За исключением особых случаев, вам не нужно ссылаться на отдельные поля при сериализации. Может быть, я не совсем понимаю, чего вы пытаетесь достичь.

Ответ №3:

Доступ к членам класса осуществляется с помощью Classname.membername. Вам не нужен дополнительный метод для этого.

Комментарии:

1. Метод BackItUp() и все списки массивов являются статическими. Таким образом, не будет ни одного экземпляра класса NIC.

2. Действительно! Итак, в чем проблема, с которой сталкивается пользователь ########?

3. Здесь меня интересует резервное копирование данных полей класса без необходимости ссылаться на какое-либо имя. Так что в будущем, если мне понадобится добавить или удалить списки массивов или изменить имя класса, мне не нужно изменять код метода ‘BackItUp()’. Я хочу сделать это более обобщенным.

4. Возможно, вы захотите взглянуть на метод DWIM. 🙂

5. Метод DWIM? Я не знаю, что это. И Google также не дает никакой подсказки. Не могли бы вы, пожалуйста, уточнить или предложить какую-нибудь ссылку?