java公共和私有的区别_java – 运行时私有,公共,包关键字之间有什么区别吗?

可访问性也在运行时强制执行.如果某些代码尝试访问不应该访问的成员,则抛出IllegalAccessException或IllegalAccessError.这是一个快速演示:

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); //

try {

AccessTest.class.getDeclaredField("secretNumber").get(instance); //

} 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)

正如迈克尔所说,这种行为可能与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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值