我正在创建一个自动化框架。这是我的问题
框架类
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的构造函数中
答案 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();
}
}
}
}