【问题标题】:How to call private constructor of super class from child class constructor?如何从子类构造函数调用超类的私有构造函数?
【发布时间】:2021-09-19 02:37:26
【问题描述】:

在 Java 中,我试图覆盖来自库的类。该类的构造函数之一是私有的,因此我无法从我的类中调用它。有没有办法解决这个问题(反思?)?

public class LibraryClass extends ProtectedLibraryClass {
  public LibraryClass() {
    super();
  }

  private LibraryClass(Boolean useFeature) {
    super(useFeature);
  }

  // Other methods
}

public class MyClass extends LibraryClass {
  
  public MyClass() {
    super();
  }

  private MyClass(Boolean useFeature) {
    super(useFeature); // <-- This line throws exception as super class constructor is private
  }
  // Override other methods
}

我不能只调用super(),然后将useFeature 标志设置为protectedLibraryClass 中的final,并且只能通过它的构造函数设置。

【问题讨论】:

  • 他们做到了private 是有原因的,我猜
  • 我怀疑你可以使用带有反射的构造函数链接,因为调用超类构造函数编译器迫使我们使用super关键字作为第一条指令,这会阻止其他语法(如反射)。

标签: java reflection private super


【解决方案1】:

我认为这是不可能的,看看this postthese docs。您可以做的是将两个(或许多)类文件放入它们自己的包中,然后使用protected 访问修饰符,以便构造函数仅在包中可用。如果您只放置继承自 LibraryClass 类的类,则与创建构造函数 private 的效果相同,如上所述。

【讨论】:

    【解决方案2】:

    他们这样做是有原因的,但你可以在 java 中使用反射来从这个类创建对象,即使它是私有的

    这是一个例子:

       public static void main(String[] args) {
            LibraryClass copy = null;
            try {
                Constructor[] constructors = LibraryClass.class.getDeclaredConstructors();
                for (Constructor constructor : constructors) {
                    constructor.setAccessible(true);
                    copy = (LibraryClass) constructor.newInstance();
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    

    【讨论】:

    • 但这会创建 LibraryClass 的实例而不是 OP MyClass
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多