有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用带有java反射且不带开关的parant引用创建子类

我有一个a类,它是AB类、AC类和AD类的分支。a类也有枚举字段“type”,它 可以是“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;
            }
        }
    ```

共 (1) 个答案

  1. # 1 楼答案

    显然,你的switch语句应该创建一个给定类型的新对象(of 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();
    

    但是编译器将迫使您处理几个潜在的异常,因为在运行时可能会出现很多错误,而在编译时无法检查这些错误