如何将 setAccessible 限制为仅“合法”用途?
我对 的力量了解得越多,我就越惊讶于它能做什么。这是根据我对问题的回答改编的(使用反射来更改静态最终File.separatorChar进行单元测试)。java.lang.reflect.AccessibleObject.setAccessible
import java.lang.reflect.*;
public class EverythingIsTrue {
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String args[]) throws Exception {
setFinalStatic(Boolean.class.getField("FALSE"), true);
System.out.format("Everything is %s", false); // "Everything is true"
}
}
你可以做真正离谱的事情:
public class UltimateAnswerToEverything {
static Integer[] ultimateAnswer() {
Integer[] ret = new Integer[256];
java.util.Arrays.fill(ret, 42);
return ret;
}
public static void main(String args[]) throws Exception {
EverythingIsTrue.setFinalStatic(
Class.forName("java.lang.Integer$IntegerCache")
.getDeclaredField("cache"),
ultimateAnswer()
);
System.out.format("6 * 9 = %d", 6 * 9); // "6 * 9 = 42"
}
}
据推测,API设计人员意识到了滥用的程度,但必须承认它具有提供它的合法用途。所以我的问题是:setAccessible
- 什么是真正合法的用途?
setAccessible
- Java可以被设计成一开始就没有这种需求吗?
- 这种设计的负面后果(如果有的话)会是什么?
- 您能限制为仅合法使用吗?
setAccessible
- 它只是通过吗?
SecurityManager
- 它是如何工作的?白名单/黑名单、粒度等?
- 是否经常必须在应用程序中对其进行配置?
- 我可以将我的类编写为 -proof,而不考虑配置吗?
setAccessible
SecurityManager
- 还是受制于管理配置的人?
- 它只是通过吗?
我想还有一个重要的问题是:我需要担心这个吗???
我的课程中没有一个有任何可强制执行的隐私表象。单例模式(将对其优点的怀疑放在一边)现在不可能执行。正如我上面的片段所显示的,即使是一些关于Java基础如何工作的基本假设,也远未得到保证。
这些问题不是真的吗???
好吧,我刚刚确认:感谢,Java字符串不是不可变的。setAccessible
import java.lang.reflect.*;
public class MutableStrings {
static void mutate(String s) throws Exception {
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set(s, s.toUpperCase().toCharArray());
}
public static void main(String args[]) throws Exception {
final String s = "Hello world!";
System.out.println(s); // "Hello world!"
mutate(s);
System.out.println(s); // "HELLO WORLD!"
}
}
我是唯一一个认为这是一个巨大的问题的人吗?