Вы не можете сделать этого через GUI SSMS, но можно сделать это с помощью сценария. БАЗА ДАННЫХ ВОССТАНОВЛЕНИЯ от ДИСКА = '\unc\path\filename' при необходимости в этом автоматизированном процессе, лучший способ должна установить Задание SQL Server и выполнить его как пользователя с доступом к расположению файла.
Вы могли бы:
@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, потому что этот подход гораздо более настраиваемый, и он также создается во время компиляции, а не во время выполнения.
Проверьте этот API org.apache.commons.lang.builder.ToStringBuilder , он предоставляет несколько способов создания toString с использованием отражения или без отражения. Взгляните также на другие подклассы.
Существует такой API, и он называется Java Reflection
Чтобы выполнить то, что вы запрашиваете, вы можете просто сделать что-то вроде:
Class<?> cls = this.getClass();
Field fieldlist[] = cls.getDeclaredFields();
for (Field aFieldlist : fieldlist) {
// build toString output with StringBuilder()
}
Это должно быть именно то, что вы ищете
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();
}
Большинство 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
, написанного во время выполнения, вероятно, будет более желательным.
Вы можете столкнуться с проблемой скорости. Если вы используете отражение, оно может быть очень медленным по сравнению с запуском собственного кода. Если вы собираетесь использовать отражение, вам, вероятно, следует иметь в памяти кеш переменных, которые вы собираетесь перебирать.