如何从子类构造函数调用超类的私有构造函数?

时间:2021-07-08 15:47:23

标签: java reflection private super

在 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 标志,因为 useFeature 标志是 final 中的 protectedLibraryClass 并且只能通过它的构造函数设置。

2 个答案:

答案 0 :(得分:0)

他们这样做是有原因的,但是您可以使用 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();
        }

    }

答案 1 :(得分:0)

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