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

Java 强制类的静态部分在不实例化的情况下运行,java,static,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 s

我有一门课:

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);
}
public class TextViewAttachedProperties{
公共静态最终字符串命名空间=”http://schemas.android.com/apk/lib/com.zworks.mvvmandroid";
私有静态最终处理程序uiHandler=新处理程序(Looper.getMainLooper());
私有静态最终字符串数据\u CONTEXT=“DataContext”;
私有静态最终字符串TEXT=“TEXT”;
私有静态最终侦听器textChanged=新侦听器(){
@凌驾
public void onEvent(最终属性changedeventargs args){
final TextView元素=(TextView)args.getSource();
if(element!=null&&args.getNewValue()!=null)
uiHandler.post(新的Runnable(){
@凌驾
公开募捐{
element.setText(args.getNewValue());
}
});
}
};
//这两条语句都有副作用,我正指望着执行它
私有静态最终AttachedProperty dataContext=AttachedProperty
.newProperty(数据上下文、命名空间、TextView.class、null);
私有静态最终AttachedProperty text=AttachedProperty
.newProperty(文本、命名空间、TextView.class、“、textChanged);
}
问题是,只有我实例化了那个类,它才会运行

无论发生什么情况,我如何强制运行它?

。也就是说,当类被加载时

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

。也就是说,当类被加载时

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

使用

Class.forName("TextViewAttachedProperties");
美国

返回与具有的类或接口关联的类对象 给定的字符串名。调用此方法相当于:

Class.forName(className,true,currentLoader)

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

其中
true
指定

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

初始化类时,将执行
静态
初始化器,并初始化
静态
字段

还有其他初始化类型的方法,例如访问该类型的
static
非常量变量、调用该类的
static
方法或实例化该类。在Java语言规范中描述

使用

Class.forName("TextViewAttachedProperties");
美国

返回与具有的类或接口关联的类对象 给定的字符串名。调用此方法相当于:

Class.forName(className,true,currentLoader)

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

其中
true
指定

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

初始化类时,将执行
静态
初始化器,并初始化
静态
字段


还有其他初始化类型的方法,例如访问该类型的
static
非常量变量、调用该类的
static
方法或实例化该类。在Java语言规范中描述

这有点令人恼火。我自己也有一个类似的问题,我只是给每个类一个static.init()方法并使其显式。它摸起来很脏,但确实管用。我不认为有一个干净的方法可以做到这一点,因为JVM甚至不知道类的存在,直到您尝试使用它。这里应该有一个类似“静态”的标记,它会告诉JVM在类位于.jar中时加载类,而不是等待它的名称被提及……这将是很好的!但是正如我所说的,它还不知道这个类是否存在,所以它不能寻找一个标记。您可以遍历jar中的每个类并手动加载它,但这对性能来说并不太好,这有点令人恼火。我自己也有一个类似的问题,我只是给每个类一个static.init()方法并使其显式。它摸起来很脏,但确实管用。我不认为有一个干净的方法可以做到这一点,因为JVM甚至不知道类的存在,直到您尝试使用它。这里应该有一个类似“静态”的标记,它会告诉JVM在类位于.jar中时加载类,而不是等待它的名称被提及……这将是很好的!但是正如我所说的,它还不知道这个类是否存在,所以它不能寻找一个标记。您可以遍历jar中的每个类并手动加载它,但这对性能不会太好。如果我正在编写一个库,我必须在某个方法(构造函数)中提到该类,用户必须调用该类才能使用该库,对吗?请阅读我提供的链接。我的理解是,第一次在任何地方提到该类时,它会强制JVM加载该类。当这种情况发生时,静态块将触发。有很多方法可以强制加载类;这篇文章的第二个答案是一个同样好的方法。另一种方法是在静态块中添加对这个类的提及,你肯定会创建一个库。因此,如果我在写库,我必须在一些方法(构造函数)中提及这个类,用户必须调用它才能使用这个库,对吗?请阅读我提供的链接。我的理解是,第一次在任何地方提到该类时,它会强制JVM加载该类。当这种情况发生时,静态块将触发。有很多方法可以强制加载类;这篇文章的第二个答案是一个同样好的方法。另一种方法是在静态块中添加对这个类的提及,您肯定会创建这个类。