如何使用 java 反射且不使用开关创建具有父引用的子 class

How to create child class with parant reference with java reflection and without switch

我有一个 class A,它是 classes AB、AC、AD 的父代。另外 class A 有枚举字段“类型” 可以是“A”\“AB”\“AC”\“AD”。 那么,如何用 java 反射替换此开关?

       public A f(Type type){
           A a;
           switch (type){
                    case A:
                        a = new A();
                        break;
                    case AB:
                        a = new AB();
                        break;
                    case AC:
                        a = new AC();
                        break;
                    case AD:
                        a = new AD();
                        break;
            }
        }
    ```

显然,您的 switch 语句应该创建给定类型(aa)的新对象。为了支持这一点,你根本不需要反射。您可以使用,例如

public class A {
  public final Supplier<A> factory;

  protected A(Supplier<A> factory) {
    this.factory = Objects.requireNonNull(factory);
  }

  public A() {
    this(A::new);
  }
}
public class AB extends A {
  public AB() {
    super(AB::new);
  }
}
public class AC extends A {
  public AC() {
    super(AC::new);
  }
}
public class AD extends A {
  public AD() {
    super(AD::new);
  }
}

然后,您可以轻松创建一个新对象,例如

A aa = new AB();
A a = aa.factory.get();

// verify our assumption
if(a.getClass() != aa.getClass())
    throw new AssertionError();

为了完整性,你可以使用反射,比如

A a = aa.getClass().getConstructor().newInstance();

但是编译器会强制你处理几个潜在的异常,因为有很多可能在运行时出错,而这些在编译时无法检查。