У меня есть класс, где у меня есть мой основной метод, из которого я вызываю два статических вызова 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. Кроме того, я читаю, что класс загружен первым, затем связан и затем инициализирован. Таким образом, статические блоки выполняются во время загрузки, но этого не происходит в моем случае.
Просьба направлять меня относительно того, где мой подход неправильный и как это происходит, поэтому в моем коде статический блок выполняется после вызова основного метода.
В Java блоки 'static' запускаются при инициализации класса, не обязательно до начала' main'. (Подумайте, что программа может генерировать свои собственные .class-файлы, содержащие «статические» блоки во время выполнения. Как они будут выполняться до 'main'?) Возможно, вы пришли из C++ или другого языка, на котором инициализируются глобальные статические объекты 'main'? –
Почему у вас есть требование делать что-то до 'main'? Не можете ли вы просто написать код, который сначала загружает файлы XML и Properties, а затем выполняет ли какая-либо другая обработка 'main'? Вы должны думать о 'main' как отправной точке для _any_ Java-программы. Выполнение чего-то другого путают. –
Спасибо за входные данные, теперь это ясно для меня. – user3592502