是否可以访问类的private修饰静态变量与静态方法?
private修饰的静态属性访问规则
常规语法访问:不允许
- private是Java中权限最严格的访问修饰符,被其修饰的成员(包括静态变量、静态方法、实例变量、实例方法)仅允许在定义该成员的类内部访问
- 你给出的示例代码中如果把
static int a = 50修改为private static int a = 50,HelloWorld类是和A类平级的外部类,直接调用A.a会触发编译报错,根本无法运行。
特殊场景:反射可实现访问
如果有特殊需求必须在外部类访问该private静态变量,可以使用Java反射机制绕过访问权限校验,示例代码如下:
import java.lang.reflect.Field; class A{ private static int a = 50; } public class HelloWorld{ public static void main(String []args) throws NoSuchFieldException, IllegalAccessException { System.out.print("A.a = "); // 获取A类的a字段对象 Field field = A.class.getDeclaredField("a"); // 绕过访问权限检查 field.setAccessible(true); // 读取静态属性值,静态属性不需要传实例对象,填null即可 int aValue = (int) field.get(null); System.out.println(aValue); } }
上述代码运行后依然可以输出A.a = 50。
注意:反射绕过访问权限的操作会破坏类的封装性,非必要场景不推荐使用。
内容的提问来源于stack exchange,提问作者DEV_BOT
相关产品推荐
相关产品推荐

