强制类的静态部分在没有实例化的情况下运行

时间:2014-04-25 19:45:46

标签: java static

我有一个班级:

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

问题是它只在我实例化该类时运行。

无论怎样,我怎么强迫它运行?

2 个答案:

答案 0 :(得分:3)

使用

Class.forName("TextViewAttachedProperties");

javadoc

  

返回与类或接口关联的Class对象   给定的字符串名称。调用此方法等同于:

     

Class.forName(className, true, currentLoader)

     

其中currentLoader表示当前的定义类加载器   类。

其中true指定

  

初始化 - 是否必须初始化类

初始化类时,将执行static初始化程序,并初始化static字段。

还有其他方法可以初始化类型,例如访问类型的static非常量变量,调用类的static方法或实例化类。 Java语言规范中描述的They are allMore or less.

答案 1 :(得分:2)

Static initialization blocks run when the JVM first sees a mention of the class。也就是说,当类加载时。

您不需要创建实例,但您需要以某种方式提及/引用该类。有很多方法可以做到这一点。