【问题标题】:Extend class with default constructor in Java [duplicate]在Java中使用默认构造函数扩展类[重复]
【发布时间】:2015-11-03 14:47:31
【问题描述】:

我需要扩展class A,但它需要覆盖其构造函数。

package com.example.io; // Package belongs to jar from maven dependency

public class A {
    A(String s, Integer i) {
        // constructor code
    }

    // other methods
}

由于它是默认构造函数(只能访问包的构造函数),我无法访问包外,因此我在源代码com.example.io 和扩展class A 中创建了相同的包名称并成功构建。

package com.example.io; // Package belongs to my source code

public class B extends A{
    B(String s, Integer i) {
        super(s, i); // Throws error on runtime
    }

    // other methods
}

但它会抛出运行时错误 -

java.lang.IllegalAccessError: tried to access method com.example.io.A.<init>(Ljava/lang/String;Ljava/lang/Integer;)V from class com.example.io.B

我该如何解决这个问题?我的意思是,有什么方法可以使用默认构造函数扩展 A 类?

【问题讨论】:

  • @ElliottFrisch 编辑发布B
  • 您需要删除所有 *.class 文件,然后重新编译。您的磁盘上仍然存在导致此问题的旧类文件。 (如果这是一个“真正的”问题,你会在编译时得到一个错误,而不是在运行时)
  • “默认”是什么意思?您是指具有包访问权限的构造函数吗?还是您的意思是默认的无参数构造函数?
  • @dantiston 具有包访问权限的构造函数
  • 另一种选择是封装是密封的,在这种情况下你不能这样做,但你绝对应该首先尝试做一个干净的构建(从早期编译中删除所有旧的 .class 文件),就像我一样上面提到的。

标签: java inheritance access-control


【解决方案1】:

您绝对不应该只复制 3rd 方库的包的名称。这可能会导致意想不到的结果。见this answer

相反,如果类是public,您应该创建自己的子类并定义自己的构造函数。如果超类的构造函数设置为包,那么你不能调用它。在这种情况下,如果您有代码,则可以根据需要重新实现必要的构造函数操作:

public class MyClass extends A {

    String myString;
    Integer myInteger;
    String myField;

    MyClass(String s, Integer i) {
        // Can't do this because it's set to package
        // super(s, i);
        // Re-implement?
        this.myString = s;
        this.myInteger = i;
        // Implement your own stuff
        this.myField = s + String.valueOf(i);
    }
}

【讨论】:

    【解决方案2】:

    你可以使用反射:

        Constructor<A> constructor = A.class.getDeclaredConstructor(String.class, Integer.class);
        constructor.setAccessible(true);
    

    事实上,我认为它不会通过将包更改为与 3rd 方库相同的方式来工作。见:Possible to use two java classes with same name and same package?

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多