根据理解,可以使用反射来操纵final
关键字的一般概念。
使用安全管理器也可以防止这种情况发生。
默认情况下是否可以启用安全管理器(在jdk安装级别)?
参考文献:
更新1:
鉴于它需要被启用以便工作,它不太可能。
我最接近的是将System.setSecurityManager(new SecurityManager())
放在类的静态块中,将其捆绑为jar并将其放在'jre / lib / ext'中,但发现默认情况下未加载我们仍然需要使用Class.forName。
所以即使是其他选项,只能使用-Djava.security.manager
标志或以编程方式添加。
答案 0 :(得分:0)
您可以使用_JAVA_OPTIONS环境变量设置默认Java系统属性,因此您可以在系统上设置_JAVA_OPTIONS="-Djava.security.manager"
,这将确保所有Java进程在启用安全管理器的情况下运行。
当然这个变量可能会被覆盖,因此根据您的环境可能不够安全。
如果您尝试确保无法使用反射覆盖特定类的最终成员,则另一个选项是在该类中放置一个静态初始化块,用于检查安全管理器是否已安装并抛出SecurityException,如果不是。