2016-12-27 3 views
0

У меня есть класс, где у меня есть мой основной метод, из которого я вызываю два статических вызова getter для одноэлементного шаблона. То есть, у меня есть 2 класса, которые имеют статические блоки и имеют геттеры для каждого из них. Для справки приведено следующее.Выполнение статического блока после ввода основного метода

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, чьи классы загрузить файл XML и файл свойств, используя статический блок, а затем использовать List/Map для хранения и извлечения значений с помощью поглотитель следующим образом:

FILELOADING:

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

PROPERTIESLOAD

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

}

URLResponse

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 вызывает в getmethod от Propertiesload, который загружает файл свойств через статический блок и загрузить файл также имеет статический блок, который затем используется основной метод, чтобы получить файлы загружены.

Наблюдение здесь представляет собой статический блок, выполняемый после вызова основного метода, когда вызов переходит к методу геттера, а не до запуска основного метода. Добавленные операторы печати в статических блоках также показывают, что элемент управления сначала переходит к основному методу и от их затем переходит к статическому блоку и статическому блоку.

Мое требование состоит в том, чтобы загружать файлы XML и файлы свойств и другие файлы перед основным методом во время загрузки класса и использовать только геттеры для извлечения коллекций, в которых мы его храним, например singleton. Кроме того, я читаю, что класс загружен первым, затем связан и затем инициализирован. Таким образом, статические блоки выполняются во время загрузки, но этого не происходит в моем случае.

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

+1

В Java блоки 'static' запускаются при инициализации класса, не обязательно до начала' main'. (Подумайте, что программа может генерировать свои собственные .class-файлы, содержащие «статические» блоки во время выполнения. Как они будут выполняться до 'main'?) Возможно, вы пришли из C++ или другого языка, на котором инициализируются глобальные статические объекты 'main'? –

+2

Почему у вас есть требование делать что-то до 'main'? Не можете ли вы просто написать код, который сначала загружает файлы XML и Properties, а затем выполняет ли какая-либо другая обработка 'main'? Вы должны думать о 'main' как отправной точке для _any_ Java-программы. Выполнение чего-то другого путают. –

+0

Спасибо за входные данные, теперь это ясно для меня. – user3592502

ответ

0

Ну, в Java статический блок запускается во время загрузки класса. В вашем случае удалите все статические блоки, которые у вас есть, и поместите их внутри ваших методов. Затем в вашем основном классе создайте статический блок и выполните необходимые вызовы, которые необходимо выполнить до начала основного метода. Ниже приведен пример кода.

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 ...."); 

    } 

} 

Надеюсь, это поможет. Счастливое кодирование.

+0

Спасибо, даже этот взгляд многообещающий. Реализовал ваше предложение. Хорошо работает. – user3592502

+0

Оцените, можете ли вы пометить его как ответ, если он был прав. –

+0

Спасибо .. за ваш вход. – user3592502