Принудительно запустить статическую часть класса без инстанцирования

1

У меня есть класс:

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);
}

И проблема в том, что он запускается только в том случае, если я создаю экземпляр этого класса.

Как я могу заставить его работать независимо от того, что?

  • 0
    Это несколько раздражает. У меня есть похожая проблема, и я просто даю каждому классу статический метод .init () и делаю его явным. Это грязно, но работает. Я не думаю, что есть чистый способ сделать это, потому что JVM даже не знает, что класс существует, пока вы не попытаетесь использовать его
  • 0
    Должно быть что-то вроде «статического» маркера, который будет указывать JVM загружать класс именно тогда, когда он находится в .jar, и не ждать, пока его имя будет упомянуто ...
Показать ещё 1 комментарий
Теги:
static

2 ответа

2
Лучший ответ

Статические блоки инициализации запускаются, когда JVM впервые видит упоминание о классе. То есть, когда класс загружается.

Вам не нужно создавать экземпляр, но вам нужно указать/ссылаться на класс каким-то образом. Существует несколько способов сделать это, чтобы сделать трюк.

  • 0
    Ой, ты прав. Исправленный.
  • 0
    Поэтому, если я пишу библиотеку, я должен упомянуть этот класс в каком-то методе (конструкторе), который пользователь должен вызвать, чтобы использовать эту библиотеку, верно?
Показать ещё 1 комментарий
3

использование

Class.forName("TextViewAttachedProperties");

Состояние javadoc

Возвращает объект класса, связанный с классом или интерфейсом, с заданным именем строки. Вызов этого метода эквивалентен:

Class.forName(className, true, currentLoader)

где currentLoader обозначает определяющий загрузчик классов текущего класса.

где true указывает

Инициализировать - должен ли класс быть инициализирован

Когда инициализируется класс, будут инициализированы static инициализаторы и будут инициализированы static поля.

Существуют и другие способы инициализации такого типа, как доступ к static непостоянной переменной типа, вызов static метода класса или создание экземпляра класса. Все они описаны в Спецификации языка Java. Более или менее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню