相关疑难解决方法(0)

使用Java反射更改私有静态final字段

我有一个带有private static final字段的类,不幸的是,我需要在运行时更改.

使用反射我得到这个错误: java.lang.IllegalAccessException: Can not set static final boolean field

有没有办法改变价值?

Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
Run Code Online (Sandbox Code Playgroud)

java reflection static final private

454
推荐指数
8
解决办法
22万
查看次数

单身和单元测试

Effective Java在单元测试单例上有以下声明

使类成为单例可能会使测试其客户端变得困难,因为除非它实现了作为其类型的接口,否则不可能将模拟实现替换为单例.

任何人都可以解释为什么会这样吗?

java singleton unit-testing

38
推荐指数
5
解决办法
3万
查看次数

在前一次反射之后,设置静态最终字段的Java反射失败

在Java中,事实证明,字段访问器被缓存,并且使用访问器具有副作用.例如:

class A {
    private static final int FOO = 5;
}

Field f = A.class.getDeclaredField("FOO");
f.setAccessible(true);
f.getInt(null); // succeeds

Field mf = Field.class.getDeclaredField("modifiers" );
mf.setAccessible(true);

f = A.class.getDeclaredField("FOO");
f.setAccessible(true);
mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
f.setInt(null, 6); // fails
Run Code Online (Sandbox Code Playgroud)

class A {
    private static final int FOO = 5;
}

Field mf = Field.class.getDeclaredField("modifiers" );
mf.setAccessible(true);

f = A.class.getDeclaredField("FOO");
f.setAccessible(true);
mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
f.setInt(null, 6); // succeeds
Run Code Online (Sandbox Code Playgroud)

这是失败的堆栈跟踪的相关位:

java.lang.IllegalAccessException: Can not set static final int field A.FOO to (int)6 …
Run Code Online (Sandbox Code Playgroud)

java reflection openjdk java-8

3
推荐指数
1
解决办法
1363
查看次数

标签 统计

java ×3

reflection ×2

final ×1

java-8 ×1

openjdk ×1

private ×1

singleton ×1

static ×1

unit-testing ×1