进入main方法后执行的静态块

Static block executing after entering main method

我有一个 class,其中有我的主要方法,我从那里调用两个静态 getter 单例模式调用。也就是说,我有 2 个 classes,它们有静态块并且每个都有 getters。以下仅供参考

public class RestAPIMain {


public static void main(String[] args) throws MalformedURLException, IOException, SAXException, XMLStreamException {
    System.out.println("Starting main");

    LinkedHashMap<String, String> urlresponses = URLResponse.getURLResponselist();
    LinkedList<String> xmllist = XMLLoad.getXMLFiles();
    System.out.println(xmllist);

上面的代码有getURLResponselist和getXMLFiles,其classes使用静态块加载XML文件和Properties文件,然后使用List/Map存储并使用 getter 检索值,如下所示:

正在加载文件:

public class FileLoad {

public static Map<String, Object> jsonload;
public static Map<String, Object> executioncontrol;

static {
    System.out.println("loading static for fileload");
    URL path = FileLoad.class.getResource("FileLoad.class");

    try {
        Enumeration<URL> e = ClassLoader.getSystemResources("/resources/json/");
        while (e.hasMoreElements()) {
            URL u = e.nextElement();
            String fileName = u.getFile();
            File folder = new File(fileName);
            File[] listOfFiles = folder.listFiles();
            for (File file : listOfFiles) {
                InputStream fis = new FileInputStream(file);
                if (file.getName().equals("RestURLS.json")) {
                    jsonload = CommonUtil.jsonToMap(IOUtils.toString(fis, "UTF-8"));
                } else if (file.getName().equals("RestExecution.json")) {
                    executioncontrol = CommonUtil.jsonToMap(IOUtils.toString(fis, "UTF-8"));
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e1) {
        e1.printStackTrace();
    }
}

public static Map<String, Object> getJSONFiles() {
    return jsonload;
}

public static Map<String, Object> getRestExecution() {
    return executioncontrol;
}

属性加载

public class PropertiesLoad {

private static Properties prop = new Properties();
public static LinkedHashMap<String, String> allkeyvalues = new LinkedHashMap<String, String>();

static {
    System.out.println("loading static for properties");
    InputStream ins;

    try {
        ins = new PropertiesLoad().getClass().getResourceAsStream("/resources/Rest.properties");
        prop.load(ins);
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static String getPropValue(String key) {
    String propkey = prop.getProperty(key);
    return propkey;
}

public static LinkedHashMap<String, String> getAllKeysValues() {
    String value = null;
    String key = null;
    for (Entry<Object, Object> keyvalues : prop.entrySet()) {
        key = (String) keyvalues.getKey();
        value = (String) keyvalues.getValue();
        allkeyvalues.put(key, value);
    }
    return allkeyvalues;
}

}

URL 响应

public class URLResponse {

public static LinkedHashMap<String, String> urlresponses = new LinkedHashMap<String, String>();

@SuppressWarnings("unused")
public static LinkedHashMap<String, String> getURLResponselist() throws MalformedURLException, IOException {

    LinkedHashMap<String, String> allkeyvalues = PropertiesLoad.getAllKeysValues();

    for (String urlkey : allkeyvalues.keySet()) {

        String urls = allkeyvalues.get(urlkey);
        System.out.println(urls);
        URL url = new URL(urls);
        InputStream urlins = new URL(urls).openStream();
        if (!(urlins.read() == -1)) {
            String xmlresponse = IOUtils.toString(urlins, "UTF-8");
            urlins.close();
            urlresponses.put(urlkey, xmlresponse);
        } else {
            HttpURLConnection http = (HttpURLConnection) ((URL) url).openConnection();
            int statusCode = http.getResponseCode();
            // TODO:add log
        }
    }
    // TODO:add log
    return urlresponses;
}

}

URLResponse 从 Propertiesload 调用 get 方法,它通过静态块加载属性文件,文件加载也有静态块,然后由 main 方法使用它来加载文件。

这里的观察是当调用转到 getter 方法时,静态块是在主方法调用之后执行的,而不是在主方法开始之前执行的 execution.Added 静态块中的打印语句也表明控件首先转到 main 方法,然后从它们移动到静态块并执行静态块。

我的要求是在 class 加载期间在 main 方法之前加载 XML 文件和属性文件以及其他文件,并仅使用 getters 来检索我们在其中的集合正在存储它,就像单身人士一样。另外,我读到 class 首先加载,然后链接然后初始化。因此,静态块在加载期间执行,但在我的情况下不会发生。

请指导我我的方法在哪里出错以及它是如何发生的,所以在我的代码中,静态块在 main 方法调用之后执行。

嗯,在 Java 静态块在 class 加载时间执行。在您的情况下,删除您当前拥有的所有静态块并将它们放在您的方法中。然后在您的 main class 中创建一个静态块并执行需要在 main 方法启动之前完成的必要调用。下面给出了示例代码。

package com.demo;

public class Sample {
    public static void print(String msg){
        System.out.println(msg);
    }

}


package com.demo;

public class Test {

    static{
        Sample.print("Invokes Before Main ...");
    }
    public static void main(String[] args) {
        System.out.println("Inside Main ....");

    }

}

希望这对您有所帮助。快乐编码。