Java: То, чтобы заставлять свойства класса создать строковое представление

Вы не можете сделать этого через GUI SSMS, но можно сделать это с помощью сценария. БАЗА ДАННЫХ ВОССТАНОВЛЕНИЯ от ДИСКА = '\unc\path\filename' при необходимости в этом автоматизированном процессе, лучший способ должна установить Задание SQL Server и выполнить его как пользователя с доступом к расположению файла.

21
задан abyx 23 November 2009 в 08:46
поделиться

6 ответов

Вы могли бы:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(getClass().getName());
  sb.append(": ");
  for (Field f : getClass().getDeclaredFields()) {
    sb.append(f.getName());
    sb.append("=");
    sb.append(f.get(this));
    sb.append(", ");
  }
  return sb.toString();
}

Не использовать конкатенацию строк для построения конечного результата из 15 элементов данных, особенно если toString () будет много звонил. Фрагментация памяти и накладные расходы могут быть очень высокими. Используйте StringBuilder для создания больших динамических строк.

Я обычно использую свою IDE (IntelliJ) для простой генерации методов toString () вместо того, чтобы использовать для этого отражение.

Другой интересный подход - использовать аннотацию @ToString из проекта Lombok :

 import lombok.ToString;

@ToString (excludes = "id")
открытый класс ToStringExample {
 частный статический final int STATIC_VAR = 10;
 частное строковое имя;
 частная форма Shape = новый квадрат (5, 10);
 частные теги String [];
 частный int id;

 @ToString (callSuper = true, includeFieldNames = true)
 общедоступный статический класс Square extends Shape {
 private final int width, height;

 public Square (int width, int height) {
 this.width = width;
 this.height = высота;
 }
 }
}

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

35
ответ дан 29 November 2019 в 06:51
поделиться

Проверьте этот API org.apache.commons.lang.builder.ToStringBuilder , он предоставляет несколько способов создания toString с использованием отражения или без отражения. Взгляните также на другие подклассы.

8
ответ дан 29 November 2019 в 06:51
поделиться

Существует такой API, и он называется Java Reflection

Чтобы выполнить то, что вы запрашиваете, вы можете просто сделать что-то вроде:

 Class<?> cls = this.getClass();
 Field fieldlist[] = cls.getDeclaredFields();
 for (Field aFieldlist : fieldlist) {
   // build toString output with StringBuilder()
 }
5
ответ дан 29 November 2019 в 06:51
поделиться

Это должно быть именно то, что вы ищете

    public String toString() {
    StringBuilder sb = new StringBuilder();
    try {
        Class c = Class.forName(this.getClass().getName());
        Method m[] = c.getDeclaredMethods();
        Object oo;

        for (int i = 0; i < m.length; i++)
            if (m[i].getName().startsWith("get")) {
                oo = m[i].invoke(this, null);
                sb.append(m[i].getName().substring(3) + ":"
                        + String.valueOf(oo) + "\n");
            }
    } catch (Throwable e) {
        System.err.println(e);
    }
    return sb.toString();
}
4
ответ дан 29 November 2019 в 06:51
поделиться

Большинство IDE предоставляют способ создания метода toString в данном классе.

Для класса Item с несколькими полями:

class Item {
    int i;
    int j;
    int k;
    int l;
    int m;
    int n;
    int o;  
}

Например, в Eclipse выполнение функции «Generate toString ()» в классе Item выше создаст следующее:

@Override
public String toString() {
    return "Item [i=" + i + ", j=" + j + ", k=" + k + ", l=" + l + ", m="
            + m + ", n=" + n + ", o=" + o + "]";
}

Использование отражения позволит программным способом наблюдать за одним собственные поля, но само отражение является довольно дорогим (читай: медленным) процессом, поэтому, если это действительно не требуется, использование фиксированного метода toString , написанного во время выполнения, вероятно, будет более желательным.

2
ответ дан 29 November 2019 в 06:51
поделиться

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

1
ответ дан 29 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: