Я пытаюсь использовать одноэлементные объекты и пытаюсь установить поле во время загрузки приложения.Но когда я пытаюсь установить поле, я получаю исключение приведения класса.В противном случае я пытаюсь разыграть, но на этот раз я использую newInstance и теряю старый экземпляр.
Моя цель - создать бины типа Spring без конструктора.И добавление прокси к бинам во время загрузки приложения.
- Нет: я не хочу использовать конструктор.Просто создаю бобы типа Spring.
Я пробовал разные решения
Пытался учить
field.set(classObject, object); --> throw Lang.class can not cast my.package.classObject
Пытался создать новый экземпляр
field.set(classObject.cast(classObject.newInstance), object); --> creating new intsance and i am loosing singleton programming approach.
И примеркод
//here i am searching all classes and adding bean and their called classes to list.
static void loadApp() {
try {
List<Class> classList = PackageScanner.getClasses(ApplicationProperties.getProperty("app.package"));
classList.forEach(item -> {
Annotation[] t = item.getAnnotationsByType(ServiceBean.class);
if (ArrayUtils.isNotEmpty(t)) {
ServiceBean bean = (ServiceBean) t[0];
if (StringUtils.isEmpty(bean.value())) {
BeanUtil.addBean(item.getSimpleName(), item);
} else {
BeanUtil.addBean(bean.value(), item);
}
}
for (Field field : item.getDeclaredFields()) {
Annotation[] a = field.getAnnotationsByType(Bean.class);
if (ArrayUtils.isNotEmpty(a)) {
try {
BeanUtil.addField(field.getName(), new AnnotatedFieldModel(item, field));
} catch (Exception e) {
LOGGER.error("Creatiton error ", e);
}
}
}
item.getFields();
});
} catch (Exception e) {
LOGGER.error("Package Reading problem ", e);
}
}
//I am getting classes from list. I don't have object bcs i didnt create any object yet.
static void addPrxoy() {
try {
BeanUtil.getFields().keySet().forEach(item -> {
AnnotatedFieldModel annotatedFieldModel = BeanUtil.getField(item);
Class clazz = BeanUtil.getBean(item);
Object object = Proxy.newProxyInstance(clazz.getClassLoader(),
new Class[]{annotatedFieldModel.getField().getType()},
new DynamicInvocationHandler());
annotatedFieldModel.getField().setAccessible(true);
try {
annotatedFieldModel.getField().set(annotatedFieldModel.getClazz(), object);
} catch (Exception e) {
LOGGER.error("Bean creation error", e);
}
});
} catch (Exception e) {
LOGGER.error("Package Reading problem ", e);
}
}