我有一个班级:
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 :(得分:3)
使用
Class.forName("TextViewAttachedProperties");
返回与类或接口关联的Class对象 给定的字符串名称。调用此方法等同于:
Class.forName(className, true, currentLoader)
其中currentLoader表示当前的定义类加载器 类。
其中true
指定
初始化 - 是否必须初始化类
初始化类时,将执行static
初始化程序,并初始化static
字段。
还有其他方法可以初始化类型,例如访问类型的static
非常量变量,调用类的static
方法或实例化类。 Java语言规范中描述的They are all。 More or less.
答案 1 :(得分:2)
Static initialization blocks run when the JVM first sees a mention of the class。也就是说,当类加载时。
您不需要创建实例,但您需要以某种方式提及/引用该类。有很多方法可以做到这一点。