保护java字符串值和大小写?

保护java字符串值和大小写?,java,Java,我的项目中有一个java类,我在其中定义和声明常量。 在该类中,我声明了一个变量,如: public static final String ACCESS_CODE = "A2mkbQ1"; 这是最后一个字符串。我不想让别人在我的项目中的任何地方修改它,即使是这样。 但是如果我在字符串上应用.toUpperCase()或.toLowerCase(),它会更改字符串的大小写。 我知道没有人可以修改这个访问代码字符串。但是我希望他们在比较这个字符串和另一个字符串时,停止对字符串调用上述方法 如何保

我的项目中有一个java类,我在其中定义和声明常量。 在该类中,我声明了一个变量,如:

public static final String ACCESS_CODE = "A2mkbQ1";
这是最后一个字符串。我不想让别人在我的项目中的任何地方修改它,即使是这样。 但是如果我在
字符串上应用
.toUpperCase()
.toLowerCase()
,它会更改字符串的大小写。 我知道没有人可以修改这个访问代码字符串。但是我希望他们在比较这个字符串和另一个字符串时,停止对字符串调用上述方法


如何保护字符串的
值和大小写?

您不能。你已经把它变成了一个可公开访问的
字符串
,所以你关于“保护”它的说法完全不存在了。此外,无论如何,它都可以通过反射访问,所以即使您将其设置为私有,也无法“保护”它


为什么您甚至认为您需要阻止代码使用它,特别是因为您已经公开了它?你会怎么处理它?你会怎么认为有人会滥用它?

字符串在Java中总是不可变的,即使你没有声明它为final。像
toUpperCase()
这样的方法要做的是返回一个新字符串

不,您不能阻止有人在
字符串
对象上调用这些方法

我知道没有人可以修改这个访问代码字符串

实际上你可以通过反射来实现,但是如果你真的这样做了,WTF

但是我希望他们在比较这个字符串和另一个字符串时,停止对字符串调用上述方法

这不会阻止他们创建此字符串的大写或小写版本

要做到这一点,您必须破解String类,这可能是个坏主意

如果访问代码被更改,则安全性不应允许它,您将在测试中发现这一点

我可以在任何地方写以下内容

 String ACCESS_CODE = "A2MKBQ1";

或者我可以使用循环来转换大小写,而不是
toUppercase()

您不能更改最终变量。通过调用toUpperCase()或toLowerCase(),可以得到这些方法返回的新字符串。您的变量将保持不变

您不能。你不应该在意。如果客户端代码不正确地使用了该值,这就是他们的问题。无论如何,这不会更改
ACCESS\u code
的内容,但您不能限制类定义的公共API的使用。唯一的问题是使用了一些包装器,这会在代码中造成很多混乱。如果调用.toUpperCase()或.toLowerCase(),字符串是不可变的-您收到了新的字符串,但它们没有修改字符串。他们正在创造一个新的。防止人们复制字符串的唯一方法是将其从代码中完全删除,这样他们就看不到它。您应该开发自己的实现,这样就没有方法,也不会公开任何内容。这样的类将完全保护数据,但完全不可用他们仍然可以调用
String my=ACCESS\u code.toUpperCase()
@sashasalau如果你通过对类(或工具)进行黑客攻击来实现这一点,你可以导致String.toUpperCase()抛出异常,但我怀疑这是一个好主意。嗯,真的很有趣!在试图调用任何字符串方法时抛出
RuntimeException
,或者更好的是
AccessCodeUnauthorizedAccessError
,甚至
toString()
。顺便问一下,是否有可能只在具体的例子上作出决定?或者整个
String
类将受到影响?@SashaSalauyou它将是整个字符串,但是您可以在抛出错误之前检查内容。@支柱:我不确定:“但是如果我在字符串访问\u代码上应用.toUpperCase()或.toLowerCase(),它会更改字符串的大小写”正确,但原因不是变量是最终的。