修改对象的私有静态成员变量属性值

私有方法:修改SrvmgrCallerKeyLocked:字段权限调整
本文档详细描述了一个私有方法如何通过反射机制,改变SrvmgrCaller类中私有静态属性的值,以绕过初始化检查。涉及字段访问控制和Java语言访问检查的解除。

    private void modifySrvmgrCallerKeyLocked() {
        try {
            //更改私有变量值
            SrvmgrCaller pt = new SrvmgrCaller();
            Class<?> srvmgrCallerClazz = SrvmgrCaller.class;
            // 获得指定类的属性
            Field field = srvmgrCallerClazz.getDeclaredField("initKeyLocked");
            // 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
            field.setAccessible(true);
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            // 更改私有静态属性的值  设置为false 防止SrvmgrCaller.initCallerKeyByValue下在if (!initKeyLocked.getAndSet(true))代码段判断过不去
            field.set(pt, new AtomicBoolean(false));
        } catch (Exception e) {
            log.error("modifySrvmgrCallerKeyLocked happens exception,excetpionMsg:{}", e.getMessage());
        }
    }

 

### 关于C++类中的私有静态成员变量 #### 概念说明 在C++中,私有静态成员变量属于整个类而非单个对象实例。这类成员在整个程序运行期间仅存在一份副本,并由该类的所有对象共享[^2]。 #### 定义方式 对于私有静态成员变量,在类内部声明时需加上`private:`访问修饰符以及`static`关键字标明其为静态属性。然而值得注意的是,尽管可以在头文件内的类定义处声明这些变量,但实际的空间分配和初始化应在源文件(.cpp)内完成[^3]。 例如: ```cpp // Header file (MyClass.h) #ifndef MYCLASS_H_ #define MYCLASS_H_ class MyClass { private: static int privateStaticVar; // 声明私有静态整型变量 public: MyClass(); }; #endif /*MYCLASS_H_*/ ``` ```cpp // Source file (MyClass.cpp) #include "MyClass.h" int MyClass::privateStaticVar = 0; // 实际定义并初始化 ``` #### 使用方法 一旦完成了上述定义过程,则可以通过类名直接操作这个静态成员变量而无需创建具体的对象实例。不过由于这里讨论的是私有级别的静态成员,因此通常会提供公共接口(即公有成员函数),以便安全地读取或修改此类变量的值[^1]。 下面给出一个简单的例子展示如何实现这一点: ```cpp // Header file (Counter.h) #ifndef COUNTER_H_ #define COUNTER_H_ class Counter { private: static unsigned long count_; // 私有静态计数器 public: Counter(); // 构造函数增加计数值 ~Counter(); // 析构函数减少计数值 static void ShowCount() const;// 显示当前计数值的方法 }; #endif /*COUNTER_H_*/ // Implementation file (Counter.cpp) #include <iostream> #include "Counter.h" unsigned long Counter::count_ = 0L; Counter::Counter(){ ++count_; } Counter::~Counter(){ --count_; } void Counter::ShowCount() const{ std::cout << "Current counter value is: " << count_ << '\n'; } ``` 在这个案例里,每当新建一个`Counter`对象时都会使`count_`加一;当销毁对象时则减去相应的数量。同时提供了静态成员函数`ShowCount()`用于输出最新的计数值给用户查看。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值