Создание своего конфига - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Тех-документация

Тех-документация Статьи по редактированию, компиляции и настройки ява серверов Lineage 2
Описание темы:Мануал

Ответ
Опции темы
Непрочитано 10.09.2013, 21:28   #1
Аватар для KID
Пользователь

Автор темы (Топик Стартер) Создание своего конфига

Маленький гайд для начинающих своих серверов: как же легко все вынести в файлик, не напрягаясь к тому же быстро.
Горождение новых закапсованных переменных и копи-паст тонн getProperty и прочего может вызвать ошибки и еще больше вопросов.

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

Что нужно для начала?

Первый файл - это файл самого конфига, в моем примере он назван ConfigMain
состоит он из
public class ConfigMain {
	@Property public static int param1;
	@Property(name = "extraConfigParamater") public static String param2;
}
Code: Java
В нем можно добавлять сколь угодно параметров, используя примитивы в виде полей.
А как же его связать с "конфиг файлом в папочке конфиг"? - просто.
public class ConfigLoader {
	public static void join(Class<?>... configs) throws Exception {
		for (Class<?> c : configs) {
			Constructor<?> cnt = c.getConstructor();
			cnt.setAccessible(true);
			Object b = cnt.newInstance();
 
			initFields(b);
		}
	}
 
	private static void initFields(Object obj) throws Exception {
		Properties prop = new Properties();
		try (InputStream is = Files.newInputStream(Paths.get(String.format("./config/%s.properties", obj.getClass().getSimpleName().substring("config".length()).toLowerCase())))) {
			prop.load(is);
		}
 
		for (Field field : obj.getClass().getDeclaredFields()) {
			Property property = field.getAnnotation(Property.class);
			if (property != null) {
				String keyname = property.name().equals("@") ? field.getName() : property.name();
				if (!prop.containsKey(keyname))
					throw new RuntimeException(String.format("config class '%s' param '%s' was not defined", obj.getClass().getSimpleName(), keyname));
 
				Object value = field.get(obj);
				String classType = field.getType().getSimpleName().toLowerCase(), keyvalue = prop.getProperty(keyname);
				switch (classType) {
					case "string":
						field.set(value, prop.getProperty(keyname));
						break;
					case "integer":
					case "int":
						field.set(value, Integer.parseInt(keyvalue));
						break;
					case "boolean":
						field.set(value, Boolean.parseBoolean(keyvalue));
						break;
					case "byte":
						field.set(value, Byte.parseByte(keyvalue));
						break;
					case "double":
						field.set(value, Double.parseDouble(keyvalue));
						break;
					case "float":
						field.set(value, Float.parseFloat(keyvalue));
						break;
					case "long":
						field.set(value, Long.parseLong(keyvalue));
						break;
					default:
						System.err.println(String.format("ConfigLoader.initFields() unk field: '%s', key: '%s'", classType, keyvalue));
						break;
				}
			}
		}
	}
}
Code: Java
В первой части метода initFields я связываю название класса с названием файла, к примеру файл ConfigMain.java будет интерпретирован как /config/main.properties
Вкратце наша старушка перечисляет все доступные поля в классе ConfigMain, аннотированные @Property, и проверяет наличие этих параметров в файле, если находит - переносит значение из файла в класс.

А теперь надо бы посмотреть что получилось?
- создаем файл для вашего конфиг класса, вносим в него данные
Цитата:
param1 = 23
extraConfigParamater = hello reflection
- создаем тест
	public static void main(String[] args) {
		System.out.printf("param1: %d, param2: %s \n", ConfigMain.param1, ConfigMain.param2);
 
		try {
			ConfigLoader.join(ConfigMain.class);
		} catch (NoSuchFileException nsf) {
			System.err.printf("config file '%s' was not found \n", nsf.getFile());
			throw new RuntimeException();
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		System.out.printf("param1 %d, param2: %s \n", ConfigMain.param1, ConfigMain.param2);
	}
Code: Java
И в моем случае на выходе теста я вижу
Цитата:
param1: 0, param2: null
param1 23, param2: hello reflection
Надо обратить внимание на то, что аннотация @Property берет имя переменной в файле по названию поля, а аннотация @Property(name = "extraConfigParamater") - берет название переменной из параметра аннотации name.

rghost
KID вне форума Отправить сообщение для KID с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 10.09.2013, 22:47   #2
Супергерой

По умолчанию Re: Создание своего конфига

Оо Игорек за гайды взялся)) Зачетно. Плюсую, новичкам пригодится!
OneThunder вне форума Ответить с цитированием
Ответ

Метки
java configs example


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
itamename-e.dat UFODriverr Lineage II 5 28.02.2021 18:17
Создание своего сервера для WarCraft 3 (PvPGN) wen1k Создание сервера 22 12.06.2013 02:05
Что нужно знать... Остин Программирование / Programming 7 06.12.2010 01:22
Создание своего портала kiberk Документация 15 20.09.2009 12:04
Создание своего РБ Nytrex Копия официального сервера 1 24.07.2008 22:21


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 08:34. Часовой пояс GMT +3.

Вверх