静态属性属于类本身,修改会影响所有实例;java中需用反射获取field、setaccessible(true)、再调用set(null, newvalue)赋值,注意final字段需额外处理修饰符。

静态属性属于类本身,而非某个实例,因此修改它会影响所有后续使用该类的地方,甚至已存在的实例(取决于访问方式)。关键在于:改的是“类对象持有的值”,不是“某一个对象的副本”。
Java 中通过反射修改静态字段
Java 不允许直接赋值静态私有字段,必须借助反射绕过访问控制:
- 用 Class.getDeclaredField("fieldName") 获取字段对象
- 调用 field.setAccessible(true) 破除 private 限制
- 调用 field.set(null, newValue) —— 注意第一个参数是 null,代表操作静态成员
- 若字段是 final 修饰的,还需先修改 modifiers 字段(需 Unsafe 或 setAccessible 配合 fieldModifiers 操作),否则运行时抛 IllegalAccessException
TypeScript/JavaScript 类的静态属性可直接赋值
TypeScript 编译后为 JS,其静态属性本质是构造函数对象上的属性,天然支持动态写入:
- MyClass.staticProp = "new value" 即可生效
- 所有后续 new MyClass() 实例,只要方法中读取 MyClass.staticProp,都会拿到新值
- 注意:若实例在修改前已缓存了该静态值(如在 constructor 里 this.cached = MyClass.staticProp),则不会自动更新
HTML 中 class 属性的动态修改(非 CSS 类,而是元素的 class 特性)
这是 DOM 层面的操作,和编程语言中的“class 静态属性”无关,但常被混淆:
- 用 element.className = "new-class" 完全覆盖原有 class
- 推荐用 element.classList.add()/remove()/toggle()/contains() 精确控制
- 修改的是单个元素的 class 属性值,不改变 CSS 规则本身,也不影响其他元素——除非它们也共享该 class 并受同一 CSS 生效
CSS 类规则本身的动态更新(进阶)
真正“修改一个 class 的样式定义”,需操作样式表:
- 遍历 document.styleSheets,找到对应 CSSRule(如 CSSStyleRule)
- 现代方式可用 sheet.insertRule(".my-class { color: red; }", index) 插入新规则,并删旧规则实现覆盖
- 或创建新的 ,反复更新 innerHTML —— 简单可靠,浏览器自动级联
- 这种修改会影响所有匹配该选择器的元素,效果等同于手动改 CSS 文件











