运行时在private,public,package关键字之间有什么区别吗?

DNB5brims:

我知道Java具有这些serval关键字来标识开发期间的变量范围,但是我想知道当它在生产环境中还是仅出于编码人员的兴趣时,这是否有所不同?谢谢。

催产素:

可访问性也在运行时强制执行。如果某些代码试图访问不应访问的成员,则将抛出IllegalAccessExceptionIllegalAccessError这是一个快速演示:

public class AccessTest {
    public int publicNumber;
    private int secretNumber;
}

public class Client {
    public static void main(String[] args) throws Exception {
        reflection();
        noReflection();
    }

    private static void noReflection() throws IllegalAccessException, NoSuchFieldException {
        int a = new AccessTest().publicNumber;
          //                     ^^^^^^^^^^^^ 
          // To be changed to secretNumber in bytecode editor after compilation

        System.out.println("Number read: " + a);
    }

    private static void reflection() throws IllegalAccessException, NoSuchFieldException {
        AccessTest instance = new AccessTest();
        AccessTest.class.getDeclaredField("publicNumber").get(instance); // <-- Works
        try {
            AccessTest.class.getDeclaredField("secretNumber").get(instance); // <-- Throws IllegalAccessException
        } catch (IllegalAccessException e) {
            System.out.println("Caught IllegalAccessException");
        }
    }
}

带反射:

实际上,以上程序输出:

Caught IllegalAccessException
Number read: 10

没有反思:

当我使用字节码编辑器进行更改时

getfield com/blah/access/AccessTest/publicNumber I

在方法noReflection()上:

getfield com/blah/access/AccessTest/secretNumber I

输出为:

Caught IllegalAccessException
Exception in thread "main" java.lang.IllegalAccessError: tried to access field com.blah.access.AccessTest.secretNumber from class com.blah.access.Client
at com.blah.access.Client.noReflection(Client.java)
at com.blah.access.Client.main(Client.java:12)

正如Michael提到的,此行为可能取决于JVM。我继续

java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01, mixed mode)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

lambda和方法引用在运行时级别之间有什么区别?

Java中的public,protected,package-private和private之间有什么区别?

c#seal和Java的final关键字之间在功能上有什么区别吗?

Java中的Implements和Extended关键字有什么区别

静态接口与Java中没有此类关键字的常规接口之间有什么区别?

'ref'和'out'关键字有什么区别?

'ref'和'out'关键字有什么区别?

TypeScript中的private关键字和private字段有什么区别?

关键字“私人”和“最终”之间有什么区别?

“数据”和“类型”关键字有什么区别?

循环宏中的“ for”和“ as”关键字之间有什么区别吗?

“ type”和“ subtype”关键字有什么区别?

Webdriver.io:capabilities和desireCapabilities关键字之间有什么区别?

使用此关键字时,为什么在调试和运行时输出不同的结果?

“ instanceof”和“ in”关键字之间有什么区别?

斯威夫特:使用as / as进行铸造之间有什么区别?/作为!关键字和C样式的强制转换?

Kubernetes中的驱动程序和容器运行时之间有什么区别?

在JavaScript中,以引号作为关键字的字符与作为对象的属性的关键字作为字符的字符之间有什么区别

/ etc和/ private / etc之间有什么区别吗?

c和c ++之间的关键字static有什么区别?

volatile和static关键字有什么区别?

语句和关键字有什么区别?

Java API中的“ Class”类和“ class”关键字之间有什么区别?

使用和不使用`New`关键字定义数组之间有什么区别?

“ as”和“ as!”有什么区别?迅速的关键字?

在序言中,关键字is和=有什么区别?

在递归函数调用期间添加 return 关键字与不添加 return 关键字有什么区别?

javascript 类方法 w/o 和 w function 关键字之间有什么区别?

函数和关键字/语句有什么区别?