使用Gradle,我们正在尝试编译遗留Java代码,这些代码是用JDK1.8编译器为JDK1.6开发的。在某个时刻,编译过程会以错误的方式退出
试图分配较弱的访问权限;是公开的
(错误本身的原因很明显:我们在一个抽象类中有一个方法,它被声明为public,但实现类却将其声明为protected。)
目前,重构整个产品代码(预计会出现更多类似的错误)不是一个选项,因此我们正在寻找一个用新的JDK构建旧代码的解决方案。
有什么能帮上忙的吗?
对于您的系统过去使用Java1.6这一事实的唯一解释是,超类中的方法访问被更改为public
而没有重新编译子类。从一开始就禁止降低子类中的可访问性。
Java语言规范1.6在第344页提供了这样的解释:
如果包点定义了类点
:
package points;
public class Point {
public int x, y;
protected void print() {
System.out.println("(" + x + "," + y + ")");
}
}
class Test extends points.Point {
protected void print() {
System.out.println("Test");
}
public static void main(String[] args) {
Test t = new Test();
t.print();
}
}
然后这些类编译并测试执行以产生输出:
Test
如果将类point
中的方法print
更改为public
,然后只重新编译point
类,然后使用test
的先前存在的二进制文件执行,那么不会发生链接错误,即使在编译时不适合由受保护的方法重写公共方法(如以下事实所示,除非将print更改为public
,否则无法使用此新的point
类重新编译test
类。)(着重部分后加)
如果必须使用Java1.8编译器重新创建确切的行为,请将超类中的可访问性更改为protected
,编译超类和子类,然后将超类中的可访问性更改为public
,并只编译超类。但是,在这一点上,我强烈建议更改子类以提供适当的可访问性。
使用Gradle,我们尝试编译遗留的Java代码,它是使用JDK 1.8编译器为JDK 1.6开发的。在某个时候,编译过程会因错误而退出 试图分配较弱的访问权限;是公开的 (错误本身的原因很明显:我们在抽象类中有一个方法,它被声明为public,但实现类将其声明为protected。) 使用JDK 1.6进行编译,我们从未遇到过任何问题。现在,出于几个原因,我们必须用Java 8编译代码,让我们遇
本文向大家介绍解决Java提示正在尝试分配更低的访问权限问题,包括了解决Java提示正在尝试分配更低的访问权限问题的使用技巧和注意事项,需要的朋友参考一下 正在尝试分配更低的访问权限?在进行Java编程时会给我们报出如下提示怎么办?这里我们将给大家介绍详细的解决方法。 首先,查看,控制台给出的提示:正在尝试分配更低的访问权限,以前为public 找到提示所在行,如案例的所示的行。在该行中,发现vo
我的系统中有以下配置: Apache Maven 3.5.2 Maven主页: /usr/share/mavenJava版本:1.8.0_162,供应商:Oracle CorporationJava主页: /usr/lib/jvm/java-8-openjdk-amd64/jre默认语言环境:en_US,平台编码:UTF-8操作系统名称:"linux",版本:"4.15.0-20-通用", arc
当我尝试注册以下代码时,会出现此错误:code 下图中出错
本文向大家介绍Java编程访问权限的控制代码详解,包括了Java编程访问权限的控制代码详解的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Java编程访问权限的控制的相关内容,具体介绍如下。 之前没去注意的修饰符,一般变量前面没添加,一个是不知道有什么用,一个是懒,后面遇到项目的时候就会发现私有和公有区别还是很大的。 (1)首先是包名 使用一个类的时候,例如集合类,就需要引入这个包,然后
我想知道,当异常发生时,try with resource语句如何在进入catch块之前关闭资源。当异常发生时,执行立即跳转到catch块。因此,try-with-resource实际上关闭了资源。 为了更好地理解它的工作原理,我决定看看编译器是如何实现它的。我编写了下面的代码并对其进行了编译。 输出 然后我访问了www.javadecompilers.com,并在那里试用了反编译程序。两个反编译