Есть ли простой способ проанализировать объект из класса A в объект из класса B, что поля являются подмножеством A?

пример:

class A{
    String aa;
    String bb;
    String cc;
    String dd;
}

class B{
    String aa;
    String bb;
}

Конечно, мои настоящие классы больше с более чем 15 полями, которые также являются сложными объектами сами по себе. сейчас я делаю

B parseToB(A a){
    B b = new b();
    b.setAa(a.getAa());
    b.setBb(a.getBb());
    return b;
}

Есть ли простой способ разобрать A на B? Библиотека или класс встроенного картографа? Это выглядит как странное место в моем коде, где я просто получаю 15 строк кода.

Всего 3 ответа


Я лично использую MapStruct в своих проектах для такого рода вещей, он обеспечивает хороший гибкий способ объявления простых отображений, а также предоставляет хорошие расширения для сложных типов отображений.

Так что для вашего примера вы можете просто определить интерфейс (или абстрактный класс)

@Mapper
public interface ObjectMapper {

    ObjectMapper INSTANCE = Mappers.getMapper(ObjectMapper.class);

    A mapToA(B b);

    B mapToB(A a);
}

Вам нужно будет настроить процессор аннотаций во время цикла сборки (если вы используете maven), а затем вы можете просто вызвать mapper в своем коде

A firstObject = new A(); //Set your variables

B secondObject = ObjectMapper.INSTANCE.mapToB(firstObject);

Например, вы можете предоставить конструктор в классе B который принимает A качестве параметра:

class B {
    String aa;
    String bb;

    public B(A a) {
        this.aa = a.getAa();
        this.bb = a.getAa();
    }
 }

И тогда вы можете создать новый экземпляр B, начиная с A, просто вызвав конструктор:

B newObject = new B(a);

Помните, что если вы хотите создать новый экземпляр класса B без параметра, вы должны добавить также пустой конструктор (который можно опустить, если других конструкторов нет):

class B {
    String aa;
    String bb;


    public B() {
    }

    public B(A a) {
        this.aa = a.getAa();
        this.bb = a.getAa();
    }
 }

Вы можете использовать отражение. Попробуй это:

static class A {

        String aa, bb;
        Integer cc;
        Boolean dd;
    }

    static class B {

        String aa, bb;
        Integer cc;
        Integer dd;

        @Override
        public String toString() {
            return "B{" + "aa=" + aa + ", bb=" + bb + ", cc=" + cc + ", dd=" + dd + '}'
        }


    }

    public static void main(String []args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
        A a = new A();
        a.aa = "aa";
        a.bb = "bb";
        a.cc = 10;
        a.dd = true;
        B b = new B();
        for (Field declaredField : b.getClass().getDeclaredFields()) {
            if (a.getClass().getDeclaredField(declaredField.getName()) != null // both class have a field with the same name      
              && a.getClass().getDeclaredField(declaredField.getName()).getType()
                  .equals(declaredField.getType())) { // and the fields are of the same type
                declaredField.set(b, a.getClass().getDeclaredField(declaredField.getName()).get(a));
            }
        }
        System.out.println(b);

    }

Есть идеи?

10000