У меня есть класс:
public class TextViewAttachedProperties {
public static final String NAMESPACE = "http://schemas.android.com/apk/lib/com.zworks.mvvmandroid";
private static final Handler uiHandler = new Handler(Looper.getMainLooper());
private static final String DATA_CONTEXT = "DataContext";
private static final String TEXT = "Text";
private static final Listener<PropertyChangedEventArgs<String>> textChanged = new Listener<PropertyChangedEventArgs<String>>() {
@Override
public void onEvent(final PropertyChangedEventArgs<String> args) {
final TextView element = (TextView) args.getSource();
if (element != null && args.getNewValue() != null)
uiHandler.post(new Runnable() {
@Override
public void run() {
element.setText(args.getNewValue());
}
});
}
};
// This two statements have side effects I'm counting on to execute
private static final AttachedProperty<Object> dataContext = AttachedProperty
.newProperty(DATA_CONTEXT, NAMESPACE, TextView.class, null);
private static final AttachedProperty<String> text = AttachedProperty
.newProperty(TEXT, NAMESPACE, TextView.class, "", textChanged);
}
И проблема в том, что он запускается только в том случае, если я создаю экземпляр этого класса.
Как я могу заставить его работать независимо от того, что?
Статические блоки инициализации запускаются, когда JVM впервые видит упоминание о классе. То есть, когда класс загружается.
Вам не нужно создавать экземпляр, но вам нужно указать/ссылаться на класс каким-то образом. Существует несколько способов сделать это, чтобы сделать трюк.
использование
Class.forName("TextViewAttachedProperties");
Состояние javadoc
Возвращает объект класса, связанный с классом или интерфейсом, с заданным именем строки. Вызов этого метода эквивалентен:
Class.forName(className, true, currentLoader)
где currentLoader обозначает определяющий загрузчик классов текущего класса.
где true
указывает
Инициализировать - должен ли класс быть инициализирован
Когда инициализируется класс, будут инициализированы static
инициализаторы и будут инициализированы static
поля.
Существуют и другие способы инициализации такого типа, как доступ к static
непостоянной переменной типа, вызов static
метода класса или создание экземпляра класса. Все они описаны в Спецификации языка Java. Более или менее.