需要使用反射和注释从父类构造函数实例化子类成员

时间:2018-11-15 10:00:23

标签: java

我正在创建一个自动化框架。这是我的问题

框架类

class SomeFrameworkObject {
        public class SomeFrameworkObject(String a, int b, String c) {
            ....
        }
}
abstract class MyFrameWorkClass {
        public MyFrameWorkClass() {
            initializeMembers();
        }
        protected initializeMembers();
}

客户应如何使用

public class ClientClass extends MyFrameWorkClass {
    SomeFrameworkObject abc1;
    SomeFrameworkObject abc2;
    SomeFrameworkObject abc3;
    ... 
    public ClientClass() {
        super();
    }
    @Override
    protected initalizeMembers() {
        abc1 = new SomeFrameworkObject("xyz", 123, "mno");
        abc2 = new SomeFrameworkObject("ddddd", 765, "aaaaa");
        abc3 = new SomeFrameworkObject("pqrs", 987, "abcd");
    }
}
public class ClientTestClass() {
    ClientClass clientClass = new ClientClass();
    ...
}

由于客户端代码中可能有很多ClientClasses,并且每个类都将有SomeFrameworkObject类的许多实例,所以我想要下面类似的方法来摆脱样板代码:

public class ClientClass extends MyFrameWorkClass {
    @FrameworkAnnotation("xyz", 123, "mno")
    SomeFrameworkObject abc1;
    @FrameworkAnnotation("ddddd", 765, "aaaaa")
    SomeFrameworkObject abc2;
    @FrameworkAnnotation("pqrs", 987, "abcd")
    SomeFrameworkObject abc3;
    ...

    public ClientClass() {
        super();
    }
}

我唯一了解的是我可以使用反射并读取注释值来创建SomeFrameworkObject的实例。

但是我的问题是我应该如何确保当客户端创建ClientClass的新实例时,SomeFrameworkObjects会自动实例化。是否可以从MyFrameWorkClass(父级)了解ClientClass(子级)的成员,并将逻辑放入MyFrameWorkClass的构造函数中

1 个答案:

答案 0 :(得分:0)

首先,我认为不可能在父类构造函数中修改子类,因为尚未完成对子类的初始化,但是我不确定并必须尝试一下。所以我发现这是可能的,并从今天学到了一些东西:)

要回答您的问题,可以,这是我的测试代码,它将帮助您解决特定的问题:

注释:

@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.FIELD )
public @interface Annotation {
    // empty
}

孩子:

public class Child extends Parent {

    private @Annotation String test;

    public Child() {
        System.out.println( this.test );
    }

    public static void main( final String[] args ) {
        new Child();
    }

}

父母:

public class Parent {

    private @Annotation String testOfParent;

    public Parent() {
        for ( int i = 0; i < this.getClass().getDeclaredFields().length; i++ ) {
            Field field = this.getClass().getDeclaredFields()[i];
            System.out.println( field );

            for ( int j = 0; j < field.getDeclaredAnnotations().length; j++ ) {
                java.lang.annotation.Annotation annotation = field.getDeclaredAnnotations()[j];
                System.out.println( annotation );
            }

            try {
                field.setAccessible( true );
                field.set( this, "Hello World!" );
            } catch ( IllegalArgumentException | IllegalAccessException ex ) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            }
        }

    }
}