gpt4 book ai didi

java - 使用静态导入时出现未经检查的异常,怎么来的?

转载 作者:搜寻专家 更新时间:2023-11-01 02:13:08 25 4
gpt4 key购买 nike

在使用继承的静态方法的静态导入时,我遇到了一些奇怪的行为:

com/example/util/BaseUtil.java:

package com.example.util;

/*default*/ class BaseUtil {
public static final void foo(){ System.out.println("foo"); }
}

com/example/util/Util.java:

package com.example.util;

public final class Util extends BaseUtil{
public static void bar(){ System.out.println("bar"); }
//foo() will be inherited
}

com/example/UtilTest.java

package com.example;

import static com.example.util.Util.bar;
import static com.example.util.Util.foo;

public class UtilTest {
public static void main(String[] args) {
bar();
foo();
}
}

运行 UtilTest 导致未经检查的异常!

Exception in thread "main" java.lang.IllegalAccessError: tried to access class com.example.util.BaseUtil from class com.example.UtilTest

    at com.example.UtilTest.main(UtilTest.java:15)

但是,如果我通过 Util(没有静态导入)引用这些方法,一切都会按预期工作:

com/example/UtilTest.java

package com.example;

import com.example.util.Util;

public class UtilTest {
public static void main(String[] args) {
Util.bar();
Util.foo();
}
}

那么,是什么给了?

最佳答案

/*default*/ class BaseUtil { //only visible within the package com/example/util

该类具有默认访问说明符,这使得它从该包外部不可见。

您需要将其公开。

更新

下面是反编译的样子:

public class com.example.UtilTest extends java.lang.Object{
public com.example.UtilTest();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: invokestatic #16; //Method com/example/util/Util.bar:()V
3: invokestatic #21; //Method com/example/util/BaseUtil.foo:()V
6: return

}

下面是我使用JD GUI得到的结果

package com.example;

import com.example.util.BaseUtil;
import com.example.util.Util;

public class UtilTest
{
public static void main(String[] args)
{
Util.bar();
BaseUtil.foo();
}
}

这当然不会编译。

这里看起来像是编译器中的一个漏洞(可能是由于静态导入)。

关于java - 使用静态导入时出现未经检查的异常,怎么来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13408053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com