Получение созданного экземпляра класса с отражением - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь использовать одноэлементные объекты и пытаюсь установить поле во время загрузки приложения.Но когда я пытаюсь установить поле, я получаю исключение приведения класса.В противном случае я пытаюсь разыграть, но на этот раз я использую 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...