Как найти JCClassDecl не примитивного типа класса, поданного во время выполнения? - PullRequest
0 голосов
/ 27 апреля 2019

Я на пути к использованию «Pluggable Annotation Processing API» для автоматического создания функции deepCopy. Когда я пытаюсь скопировать не примитивную переменную, хранящуюся в экземпляре. Я просто не могу найти API, который может помочь мне узнать класс не примитивной переменной.

Тело функции deepCopy должно быть таким же, как shadowCopy, если нет не примитивных полей. как показано ниже:

XXX xXX=new XXX();
xxx.field=this.field;
return xXX;

если есть некоторые не примитивные поля, коды должны быть такими:

XXX xXX=new XXX();
Field field=new Field();
field.subField=xXX.getField().getSubField()
return xXX;

Самое большее, что я получаю, - это набор элементов, аннотированный моей пользовательской аннотацией "DeepCopier". когда я расширяю javax.annotation.processing.AbstractProcessor и переписываю «process». весь контекст будет JCClassDecl аннотированного класса POJO. Кажется, я никак не могу получить поле JCClassDecl, которое мне нужно.

public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        Set<? extends Element> set = roundEnv.getElementsAnnotatedWith(DeepCopier.class);

        set.stream().forEach(element -> {
            JCTree jcTree = trees.getTree(element);

            jcTree.accept(new TreeTranslator() {
                @Override
                public void visitClassDef(JCTree.JCClassDecl jcClass) {

                    jcClass.defs = jcClass.defs.append(
                            createDeepCopy(jcClass)
                    );

                }
            });

        });


        return true;
    }

Любая помощь будет оценена !!

...