Инициализация полей по аннотациям
Подскажите пожалуйста, есть класс нужно заполнить его поля из файла property.properties, используя аннотации?
Ответы (3 шт):
Если вы используете Spring framework или Spring Boot, то можете воспользоваться аннотацией @Value Например, имеется класс
public class SomeTestClass {
private String host;
private int port;
}
И имеется конфигурационный файл application.properties
application.port=8080
application.host=localhost
То для того, чтобы spring заполнил информацию класса настройками из файла, класс необходимо сделать spring-бином (например, с помощью аннотации Configuration) и добавить над каждым полем название конфигурации в файле:
@Configuration
public class SomeTestClass {
@Value("{application.host}")
private String host;
@Value("{application.port}")
private int port;
}
Надеюсь это то, что требовалось.
Если без спринга
public class ValueTest {
public static void main(String[] args) throws IOException {
ValueTest valueTest = new ValueTest();
valueTest.getPropValues();
}
public void getPropValues() throws IOException {
Properties prop = new Properties();
String propFileName = "hello.properties";
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(inputStream);
String message = prop.getProperty("message");
System.out.println(message);
}
}
> hello.properties
message = hello
Если ручками делать то получится приблизительно следующее
Файл prop.properties в /src
name = John
age = 15
pass = 12345
Файл Man(Класс для заполнения)
@InitClass
public class Man {
@InitField
String name;
@InitField
Integer age;
@InitField
String pass;
@Override
public String toString() {
return "Man{" +
"name='" + name + '\'' +
", age=" + age +
", pass='" + pass + '\'' +
'}';
}
}
Файл с аннотацией для класса
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@interface InitClass {
}
Файл с аннотацией для полей
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface InitField {
}
Класс для проверки аннотация и инициализации полей из файла(берет имя поля и ищет такой же ключ в properties). Чтобы приводить данный из properties к типу полей нашел в пакете sun TypeConverter. Сразу думал сам писать(но это очень не приятно). Также тут нету проверок и обработок исключительных ситуаций. Думаю добавите)
Но лучше наверное Spring
import sun.plugin.com.TypeConverter;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Properties;
public class Initialization {
public void initializationValues(Object object, Class<?> clazz) throws Exception {
if (object != null) {
if (clazz.isAnnotationPresent(InitClass.class)) {
Properties properties = new Properties();
InputStream is = getClass().getClassLoader().getResourceAsStream("prop.properties");
properties.load(is);
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(InitField.class)) {
field.setAccessible(true);
field.set(object, castObject(field.getType(), properties.getProperty(field.getName())));
}
}
}
}
}
private <T> T castObject(Class<T> to, Object from) {
return (T) TypeConverter.convertObject(to, from);
}
}
И собственно класс Main для проверки работы
public class Main {
public static void main(String[] args) throws Exception {
Man man = new Man();
new Initialization().initializationValues(man, Man.class);
System.out.println(man);
}
}